【问题标题】:How do I execute a dynamic SQL with over 8000 Characters?如何执行超过 8000 个字符的动态 SQL?
【发布时间】:2020-12-17 11:32:33
【问题描述】:

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

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

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

EXEC sp_executesql @sqlQuery

但是,当我这样做时,当@sqlQuery 超过 8000 个字符时,我会收到标题中提到的错误

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


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 个字符的限制,但具体细节我不知道。

感谢您提供任何帮助。

【问题讨论】:

  • 限制的是OPENROWSET,而不是动态SQL。
  • 是否可以以某种方式执行查询?
  • 我尝试了这里提到的在 LinkedServer 的 EXECUTE (@SQL):dba.stackexchange.com/questions/187522/… 但后来我收到错误:无法为链接服务器“SSAS”初始化 OLE DB 提供程序“MSOLAP”的数据源对象"。

标签: mdx sql-server-2016 openrowset sp-executesql


【解决方案1】:

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

循环结束后,我只需从 temporyr 表中选择 *。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 2011-12-17
    • 2014-07-25
    • 2023-03-14
    • 2013-05-31
    • 2012-12-30
    相关资源
    最近更新 更多