如何执行超过 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.
我正在尝试使用以下代码执行将 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.