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 次 |
| 最近记录: |