针对分析服务器的 OPENQUERY 中的 8000 个字符限制

AKe*_*ski 4 sql-server ssas mdx

我有一个类似的查询

SELECT column1, column2 FROM OPENQUERY(AnalysisServerName, 'MDX QUERY ...').
Run Code Online (Sandbox Code Playgroud)

它位于存储过程中。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)
Run Code Online (Sandbox Code Playgroud)

即使我可以直接在分析服务器上执行很长的 MDX 查询

DECLARE @myStatement VARCHAR(MAX)
SET @myStatement = 'OPENQUERY(AnalysisServerName, 'MDX Query')'

EXECUTE (@myStatement) AT AnalysisServerName
Run Code Online (Sandbox Code Playgroud)

我无法对存储过程中的结果做任何事情,因为

DECLARE @myStatement VARCHAR(MAX)
SET @myStatement = 'SELECT column1, column2 FROM OPENQUERY(AnalysisServerName, 'MDX Query')'

EXECUTE (@myStatement) AT AnalysisServerName
Run Code Online (Sandbox Code Playgroud)

不被允许。


那么在这种情况下我能做什么呢?

我需要

  • 查询分析服务OPENQUERY
  • 处理长度大于8000的查询,
  • 将结果保存到临时表或直接选择它们。

Dav*_*oft 10

我需要

  • 使用 OPENQUERY 查询分析服务,
  • 处理长度大于8000的查询,
  • 将结果保存到临时表或直接选择它们。sql-serverssasmdxEdit 标签

而不是 OPENQUERY 使用INSERT ... EXEC ... AT LinkedServer,像这样:

create table #t(id int, a int)

insert into #t
exec ('select 1 id, 2 a') at LinkedServer

select * from #t
Run Code Online (Sandbox Code Playgroud)

这是使用 SSAS 和 MDX 的示例:

USE [master]
go

/****** Object:  LinkedServer [SSAS]    Script Date: 7/29/2021 11:27:57 AM ******/
EXEC master.dbo.sp_addlinkedserver @server = N'SSAS', @srvproduct=N'', @provider=N'MSOLAP', @datasrc=N'localhost', @catalog=N'Adventure Works Internet Sales'
 /* For security reasons the linked server remote logins password is changed with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'SSAS',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL
go

EXEC master.dbo.sp_serveroption @server=N'SSAS', @optname=N'collation compatible', @optvalue=N'false'
go

EXEC master.dbo.sp_serveroption @server=N'SSAS', @optname=N'data access', @optvalue=N'true'
go

EXEC master.dbo.sp_serveroption @server=N'SSAS', @optname=N'dist', @optvalue=N'false'
go

EXEC master.dbo.sp_serveroption @server=N'SSAS', @optname=N'pub', @optvalue=N'false'
go

EXEC master.dbo.sp_serveroption @server=N'SSAS', @optname=N'rpc', @optvalue=N'true'
go

EXEC master.dbo.sp_serveroption @server=N'SSAS', @optname=N'rpc out', @optvalue=N'true'
go

EXEC master.dbo.sp_serveroption @server=N'SSAS', @optname=N'sub', @optvalue=N'false'
go

EXEC master.dbo.sp_serveroption @server=N'SSAS', @optname=N'connect timeout', @optvalue=N'0'
go

EXEC master.dbo.sp_serveroption @server=N'SSAS', @optname=N'collation name', @optvalue=null
go

EXEC master.dbo.sp_serveroption @server=N'SSAS', @optname=N'lazy schema validation', @optvalue=N'false'
go

EXEC master.dbo.sp_serveroption @server=N'SSAS', @optname=N'query timeout', @optvalue=N'0'
go

EXEC master.dbo.sp_serveroption @server=N'SSAS', @optname=N'use remote collation', @optvalue=N'true'
go

EXEC master.dbo.sp_serveroption @server=N'SSAS', @optname=N'remote proc transaction promotion', @optvalue=N'false'
go



drop table if exists #t
go
create table #t
(
  [[Date]].[Fiscal Year]].[Fiscal Year]].[MEMBER_CAPTION]]] varchar(20), 
  [[Measures]].[Internet Total Sales]]] decimal(20,2),
  [[Measures]].[Internet Total Tax Amt]]] decimal(20,2)
)

insert into #t
exec ('
SELECT  
    { [Measures].[Internet Total Sales],   
        [Measures].[Internet Total Tax Amt]} ON COLUMNS,  
    { [Date].[Fiscal Year].AllMembers  } ON ROWS  
FROM [Adventure Works Internet Sales Model]  
') at SSAS

select * from #t
Run Code Online (Sandbox Code Playgroud)