【发布时间】: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