Sql-Server

針對分析伺服器的 OPENQUERY 限制為 8000 個字元

  • July 29, 2021

我有一個像這樣的查詢

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 查詢分析服務,
  • 處理長度大於8000的查詢,
  • 將結果保存到臨時表或直接選擇它們。sql-serverssasmdx編輯標籤

而不是 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

這是使用 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

引用自:https://dba.stackexchange.com/questions/296287