如何执行超过 8000 个字符的动态 SQL?

How do I execute a dynamic SQL with over 8000 Characters?

我正在尝试使用以下代码执行将 SQL 与 MDX 数据合并的存储过程:

OPENROWSET('MSOLAP',..)-Function.

我通过在存储过程中构建一个字符串并像这样执行它来做到这一点

EXEC sp_executesql @sqlQuery

但是,当我这样做时,@sqlQuery 超过 8000 个字符

时出现标题中提到的错误

OPENROWSET() 部分正在执行 MDX 查询,根据错误,由于 @MDXEntityIdSet 参数中的 ID 数量,这也是超过 8000 个字符限制的部分。


SET @SQLMDXQuery=
  'with MQ
  (
    Datum
   ,Messwert
   ,Schlüssel
   ,MDXName
  )
  as
  (
  SELECT   
    convert(DATETIME,"[Measures].[DateTimeKey]")
    ,convert(FLOAT,"[Measures].[KPIValue]")
    ,convert(nvarchar(max),"[Measures].[EntityKey]")
    ,convert(nvarchar(max),"[Measures].[EntityName]")  
  FROM        
    OPENROWSET(''MSOLAP'',''Persist Security Info=False;Data Source=dwh-test-50-sql; Catalog='+@DBCatalog+';'',';
    --OPENQUERY(SSAS,';

set @MDXPart=convert(nvarchar(max),
  '''WITH
    MEMBER [Measures].[DateTimeKey] AS '+@MDXShortDateTimeKey+'.CurrentMember.Properties("KEY")
    MEMBER [Measures].[KPIValue] AS '+@MDXAggregation+'
    MEMBER [Measures].[EntityKey] As '+@MDXEntityString+'.CurrentMember.Properties("KEY")
    MEMBER [Measures].[EntityName] As '+@MDXEntityString+'.CurrentMember.Properties("NAME")
  SELECT
  {
    [Measures].[DateTimeKey],
    [Measures].[KPIValue],
    [Measures].[EntityKey],
    [Measures].[EntityName]
  }ON COLUMNS
  ,
  {'
    +@MDXDateTimeKey+'} * {'+convert(nvarchar(max),@MDXEntityIdSet)+'
  } 
  dimension Properties MEMBER_CAPTION, MEMBER_KEY ON ROWS
  FROM 
  (
   '+@LocalTimeZoneId+'    
    FROM
    (
      SELECT
      {
        '+@MDXStartDate+':'+@MDXEndDate+'
      } ON COLUMNS     
      from [Measurements]
    )
  )'''+
')) ')

SET @SQLPart = 'Select  MQ.*, '+@MetaDataEntityObject+'.* '+IIF(@SelectStr<>'',','+@SelectStr,'')+' from MQ left join '+@MetaDataEntityObject+' on ''{''+CONVERT(nvarchar(max),'+@MetaDataEntityObject+'.Id)+''}'' = MQ.Schlüssel Order by MQ.Datum';

SET @sqlQuery = convert(nvarchar(max),@SQLMDXQuery + @MDXPart + @SQLPart);

我读到可以通过某种方式规避 8000 个字符的限制,但具体细节让我难以理解。

在此感谢任何帮助。

我通过创建第二个存储过程来解决 8000 个字符的限制,该存储过程确定一次可以将多少个 ID 传递给第一个存储过程而不超过 8000 个字符的限制,然后多次调用它并附加结果集每次调用临时 table.

循环完成后,我只是 select * 从临时 table.