我有一个像这样的查询
SELECT column1, column2 FROM OPENQUERY(AnalysisServerName, 'MDX QUERY ...').
它在一个存储过程中。MDX 查询是在其中动态构建的,查询的长度远远超过 8000 个字符(最多可达到 400 000 个符号)。
MDX 查询返回大约 200 列,我只需要其中的一些。由于尺寸复杂性,我无法减少数量。
因此,我必须将结果写入临时表或直接SELECT
将它们作为过程的结果。我决定对SELECT
他们。但是,当我尝试用 省略 8000 个字符的限制时EXEC OPENQUERY(AnalysisServerName, 'MDX QUERY ...') AT AnalysisServerName
,我无法SELECT
甚至将它们保存到临时表中,因为它发生在存储过程中并且不允许嵌套(遵循此线程)。
我希望我能做到
SELECT column1, column2 FROM (EXEC OPENQUERY(AnalysisServerName, 'MDX Query') AT AnalysisServerName)
即使我可以直接在分析服务器上执行很长的 MDX 查询
DECLARE @myStatement VARCHAR(MAX)
SET @myStatement = 'OPENQUERY(AnalysisServerName, 'MDX Query')'
EXECUTE (@myStatement) AT AnalysisServerName
我无法对存储过程中的结果做任何事情,因为
DECLARE @myStatement VARCHAR(MAX)
SET @myStatement = 'SELECT column1, column2 FROM OPENQUERY(AnalysisServerName, 'MDX Query')'
EXECUTE (@myStatement) AT AnalysisServerName
不被允许。
那么在这种情况下我能做些什么呢?
我需要
- 查询分析服务
OPENQUERY
, - 处理长度大于8000的查询,
- 将结果保存到临时表或直接选择它们。
而不是 OPENQUERY 使用
INSERT ... EXEC ... AT LinkedServer
,像这样:这是使用 SSAS 和 MDX 的示例:
您可以尝试避免使用 openquery 并使用 SSIS 或 Azure 数据工厂或其他一些没有 8K 字符查询限制的 ETL 工具。
或者,如果您想继续使用 openquery,但如果您收到超过 8000 个字符,我会怀疑您要么有很长的度量列表,要么有很长的维度成员列表(或两者都有)
您可以通过创建NAMED SET来减少必须输入的成员数量。
然后,而不是有一些类似的东西
你可以写
您可以通过添加层次结构或虚假维度来实现类似的效果。
哪种解决方案最好取决于您的多维数据集设计和实际查询,但解决此问题的一种方法是对您的多维数据集进行一些更改,以使您保持在 8000 个字符的限制内