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
,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)
归档时间: |
|
查看次数: |
76 次 |
最近记录: |