65.9K
CodeProject 正在变化。 阅读更多。
Home

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

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2014年9月27日

CPOL

3分钟阅读

viewsIcon

22322

downloadIcon

27

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

引言

本文介绍混合查询,以及如何使用 MDX 结合来自 Cube 的数据,并使用 T-SQL 结合来自关系数据库的数据。

背景

以下情况可以使用混合查询:

  1. 您想要将来自多维数据集的数据与来自关系数据库的数据(多维数据集中不存在的附加数据)相结合,以用于报告目的。
  2. 您想要通过 SQL Server Agent 作业将 MDX 结果集发送给用户。
  3. 您正在进行数据挖掘,并想要基于 SQL 数据库中的数据预测值。
  4. 您想要将来自 MDX 的聚合数据与 OLTP 中的数据相结合。

在本文中,我将讨论第一点,并通过示例演示如何在 SSRS 中显示合并后的结果集。

Using the Code

我们需要做的第一件事是从 OLTP 服务器为 OLAP 数据库设置一个链接服务器

  1. 在 Management Studio 中连接到数据库引擎。

    展开“服务器对象”,右键单击“链接服务器”,然后单击“新建链接服务器”。

  2. 为链接服务器定义一个名称,并按照以下屏幕截图所示设置以下选项
    • 提供程序:Microsoft OLE DB Provider for Analysis Services 10.0
    • 产品名称:MSOLAP.4
    • 数据源:(您的 OLAP 服务器的名称)
    • 目录:(OLAP 数据库的名称)

    然后按“确定”。

  3. 展开“链接服务器”节点以确保已成功添加。

    现在,让我们通过从 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

  4. 假设我们在源数据库中有一个 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'); 
  5. 现在,我们需要将 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”。

  6. 添加新报告,SharedDataSource 应该指向 OLTP 数据库,如下所述

  7. 向报告添加新数据集,并将查询粘贴到其设计器中,如下所示

  8. 最后,运行报告并检查结果

关注点

我希望本文对任何在将 OLTP 与 OLAP 多维数据集集成时遇到问题的人有所帮助。

最后的话…… 如果您只能基于 MDX 构建报告,那么请不要使用此方法,但有时您需要合并 OLTP 中的数据,在这种情况下,请使用混合查询。

欢迎提出任何意见、建议或想法!

历史

  • 2014 年 9 月 27 日:初始版本
© . All rights reserved.