Sql-Server
針對分析伺服器的 OPENQUERY 限制為 8000 個字元
我有一個像這樣的查詢
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