在 SSRS 中将 MDX 与 T-SQL 组合在一个结果集中(混合查询)





0/5 (0投票)
在 SSRS 中将 MDX 与 T-SQL 组合在一个结果集中(混合查询)
引言
本文介绍混合查询,以及如何使用 MDX 结合来自 Cube 的数据,并使用 T-SQL 结合来自关系数据库的数据。
背景
以下情况可以使用混合查询:
- 您想要将来自多维数据集的数据与来自关系数据库的数据(多维数据集中不存在的附加数据)相结合,以用于报告目的。
- 您想要通过 SQL Server Agent 作业将 MDX 结果集发送给用户。
- 您正在进行数据挖掘,并想要基于 SQL 数据库中的数据预测值。
- 您想要将来自 MDX 的聚合数据与 OLTP 中的数据相结合。
在本文中,我将讨论第一点,并通过示例演示如何在 SSRS 中显示合并后的结果集。
Using the Code
我们需要做的第一件事是从 OLTP 服务器为 OLAP 数据库设置一个链接服务器。
- 在 Management Studio 中连接到数据库引擎。
展开“服务器对象”,右键单击“链接服务器”,然后单击“新建链接服务器”。
- 为链接服务器定义一个名称,并按照以下屏幕截图所示设置以下选项
- 提供程序:Microsoft OLE DB Provider for Analysis Services 10.0
- 产品名称:MSOLAP.4
- 数据源:(您的 OLAP 服务器的名称)
- 目录:(OLAP 数据库的名称)
然后按“确定”。
- 展开“链接服务器”节点以确保已成功添加。
现在,让我们通过从 OLTP 服务器运行以下查询来测试链接服务器(在本例中为
LINKED_OLAP_SERVER
)select * from openquery(LINKED_OLAP_SERVER, 'SELECT NON EMPTY _ { [Measures].[Sales Amount] } ON COLUMNS FROM [Sales]')
请注意,查询返回结果,这意味着链接服务器工作正常! 在此查询中,我使用了
OPENQUERY
,那么OPENQUERY
命令是什么?OPENQUERY
命令用于在特定链接服务器上执行传递查询,它用作两个数据库系统之间的通信通道,就像一个翻译器,允许 OLTP 与其他数据库系统通信,对其他数据库(例如 Oracle、Sybase 和 OLAP)运行查询,我们稍后将详细讨论OPENQUERY
。 - 假设我们在源数据库中有一个 Products Feedback 表,该表存储了客户对 OLAP 多维数据集中的每个产品(如果有)的反馈。 我为此示例创建了此表。
CREATE TABLE dbo.ProductFeedback( ProductId int NOT NULL, [Customer's Comments] nvarchar(255) NULL ); INSERT INTO ProductFeedback(ProductId, [Customer's Comments]) VALUES (486, 'It says oversize adult on the order and on the ...'), (225, 'fits nice, buckles work good'), (225, 'Perfect......'), (225, 'So far, so good');
- 现在,我们需要将
dbo.ProductFeedback
表与 MDX 查询的结果集连接起来,以生成合并的结果集。这可以通过前面提到的
OPENQUERY
参数来完成,以表格格式从 Sales Cube 中提取数据。WITH MDX_Query ( [Sales Amount], [English Product Name], [Product Key] ) AS ( SELECT CONVERT(decimal(20,2), "[Measures].[Sales Amount]" ) AS [Sales Amount], CONVERT(nvarchar, "[Dim Product].[English Product Name]._ [English Product Name].[MEMBER_CAPTION]") AS [English Product Name], CONVERT(int, CAST("[Dim Product].[Product Key].[Product Key]._ [MEMBER_CAPTION]" AS nvarchar)) AS [Product Key] FROM OPENQUERY(LINKED_OLAP_SERVER, 'SELECT [Measures].[Sales Amount] ON COLUMNS, { CROSSJOIN([Dim Product].[English Product Name].[English Product Name].Members, [Dim Product].[Product Key].[Product Key].Members) } ON ROWS FROM [Sales]' ) ) SELECT MQ.[Product Key], MQ.[English Product Name], MQ.[Sales Amount], PF.[Customer's Comments] FROM MDX_Query AS MQ INNER JOIN [dbo].[ProductFeedback] AS PF ON PF.[ProductId] = MQ.[Product Key]
上面的查询返回了 MDX 查询中的所有产品列表,并且还返回了来自 OLTP 数据库的客户反馈,此查询的结果可以在 RDL 报告中使用,其数据源类型为“Microsoft SQL Server”。
- 添加新报告,
SharedDataSource
应该指向 OLTP 数据库,如下所述 - 向报告添加新数据集,并将查询粘贴到其设计器中,如下所示
- 最后,运行报告并检查结果
关注点
我希望本文对任何在将 OLTP 与 OLAP 多维数据集集成时遇到问题的人有所帮助。
最后的话…… 如果您只能基于 MDX 构建报告,那么请不要使用此方法,但有时您需要合并 OLTP 中的数据,在这种情况下,请使用混合查询。
欢迎提出任何意见、建议或想法!
历史
- 2014 年 9 月 27 日:初始版本