Notification Services 的 MDX 查询

多维表达式 (MDX) 查询的结果集可以有多个维。不过,此事件提供程序要求其 MDX 查询返回平面行集,平面行集又可以作为一组事件提交到 Notification Services 应用程序。

MDX 查询必须返回列映射到事件类字段的结果集。第一个 MDX 结果列应该映射到第一个事件类字段,第二个结果列应该映射到第二个事件类字段,依此类推。

Analysis Services 事件提供程序的 MDX 查询可以是静态查询。静态查询表示在创建该应用程序时便知道整个查询。或者,这些查询也可以是动态查询。动态查询表示 ROWS 轴的元素或 MDX 查询切片器的元素都是通过执行 Transact-SQL 查询而获得的。通过使用 XSL 转换将 Transact-SQL 查询的结果用于生成最终的 MDX 查询。

静态 MDX 查询

如果您知道为 Notification Services 应用程序获取数据所需的具体查询,可以编写静态查询。Notification Services 将对应用程序定义中指定的量程计划运行这个具体查询。

请考虑以下事件类定义:

<EventClass>
    <EventClassName>KPIEvents</EventClassName>
    <Schema>
        <Field>
            <FieldName>Employee</FieldName>
            <FieldType>varchar(100)</FieldType>
        </Field>
        <Field>
            <FieldName>ProfitMargin</FieldName>
            <FieldType>varchar(10)</FieldType>
        </Field>
        <Field>
            <FieldName>OrderQuantity</FieldName>
            <FieldType>int</FieldType>
        </Field>
        <Field>
            <FieldName>SalesAmount</FieldName>
            <FieldType>money</FieldType>
        </Field>
    </Schema>
</EventClass>

下面是静态 MDX 查询的示例,它返回映射到此事件类的相应结果:

SELECT
      {[Measures].[Reseller Gross Profit Margin], 
      [Measures].[Reseller Order Quantity], 
      [Measures].[Reseller Sales Amount]} ON COLUMNS,
      {[Employee].[Employees].[Ken J. Snchez], 
      [Employee].[Employees].[Amy E. Alberts]} ON ROWS
FROM [Adventure Works] 
WHERE [Date].[Calendar].[CY 2002]

此查询从 Adventure Works 多维数据集选择三个度量值。这些度量值是结果集中的列。该查询受到进一步限制,选择只与两个员工 Ken J. Sánchez 和 Amy E. Alberts 有关的行。

Order Time 维度中有多个元组。因此,该查询进一步限制或“切分”该查询,使其仅显示 2002 年。

最终结果集是一个显示 2002 年所选员工的“分销商毛利润率”、“分销商订单数量”****和“分销商销售额”值的表。

  分销商毛利润率 分销商订单数量 分销商销售额

Ken J. Sánchez

1.34%

58,241

$24,144,429.65

Amy E. Alberts

4.68%

10,546

$3,457,549.94

Notification Services 运行此查询时,将二维结果集作为事件批次提交到事件类。

动态 MDX 查询

对于 Notification Services 应用程序,您可能只需要选择订阅了应用程序的员工的数据。不过,由于员工可以添加和删除订阅,因此在构建应用程序时不会有静态查询的固定列表。

您可以编写一个返回每个员工记录的静态查询,查看该员工已订阅还是未订阅。然而,如果多维数据集包括数万个员工,则静态查询会为每个员工返回一行。这是一个包含不相关的数据的大事件批次。

可以通过编写动态 MDX 查询来显著改进应用程序的性能。请考虑使用以下架构的订阅类:

<SubscriptionClass>
    <SubscriptionClassName>KPISubscriptions</SubscriptionClassName>
    <Schema>
        <Field>
            <FieldName>DeviceName</FieldName>
            <FieldType>nvarchar(255)</FieldType>
            <FieldTypeMods>NOT NULL</FieldTypeMods>
        </Field>
        <Field>
            <FieldName>SubscriberLocale</FieldName>
            <FieldType>nvarchar(10)</FieldType>
            <FieldTypeMods>NOT NULL</FieldTypeMods>
        </Field>
        <Field>
            <FieldName>EmployeeFullName</FieldName>
            <FieldType>varchar(100)</FieldType>
        </Field>
        <Field>
            <FieldName>ProfitMargin</FieldName>
            <FieldType>varchar(10)</FieldType>
        </Field>
    </Schema>
    ...
</SubscriptionClass>

首先,编写选择感兴趣的项(如员工)的列表的 Transact-SQL 查询:

SELECT EmployeeFullName as Employee
FROM NSKPISubscriptionsView

此查询假设名字包括中间大写字母。

Analysis Services 事件提供程序使用 XML 形式获取此 Transact-SQL 查询的结果,其中,所选的每个列名均作为行元素的属性返回:

<rows>
    <row Employee="Ken J. Snchez" />
    <row Employee="Amy E. Alberts" />
    <row Employee="Terry Lee Duffy" />
    <row Employee="Brian S. Welcker" />
</rows>

然后,编写将结果列表格式化为完整 MDX 查询的 XSL 转换。例如,该转换可以编写针对 match="rows" 的查询的已知部分。然后,针对每行,将该值转换为 MDX 查询的 ON ROWS 规范中的项。若要转换该 XML,请使用以下 XSL 转换:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="rows">
SELECT 
    { [Measures].[Total Product Cost], 
       KPIValue([Gross Profit Margin]), 
       KPIGoal([Gross Profit Margin]), 
       KPIStatus([Gross Profit Margin]), 
       KPITrend([Gross Profit Margin]) } ON COLUMNS,
    { <xsl:apply-templates select="row"/> } ON ROWS
FROM [Adventure Works] 
WHERE [Date].[Calendar Time].[2002]
</xsl:template>
<xsl:template match="row"> 
    <xsl:apply-templates select="@Employee" />
    <xsl:if test="not(position()=last())">,
    </xsl:if> 
</xsl:template>
<xsl:template match="@Employee">[Employee].[Employees].[<xsl:value-of select="."/>]</xsl:template>
</xsl:stylesheet>

此转换的结果是完整的 MDX 查询:

SELECT
      {[Measures].[Reseller Gross Profit Margin], 
      [Measures].[Reseller Order Quantity], 
      [Measures].[Reseller Sales Amount]} ON COLUMNS,
    { [Employee].[Employees].[Ken J. Snchez],
       [Employee].[Employees].[Amy E. Alberts],
       [Employee].[Employees].[Brian S. Welcker] } ON ROWS
FROM [Adventure Works] 
WHERE [Date].[Calendar].[CY 2002]

Analysis Services 事件提供程序使用事件提供程序每次运行时动态生成的这一查询,来查询事件数据的多维数据集。

在此 XSL 转换中,切片器 [Date].[Calendar].[CY 2002] 被硬编码到该转换中。Transact-SQL 查询可以使用 SlicerQuery 参数传递到 Analysis Services 事件提供程序,以动态创建 WHERE 子句。

行查询和切片器查询的结果被组合到单个 XML 结果中:

<rows>
    <row Employee="Ken J. Snchez" />
    <row Employee="Amy E. Alberts" />
    <row Employee="Brian S. Welcker" />
</rows>
<slicers>
    <slicer Calendar="CY 2002"/>
</slicers>

您的 XSL 转换应用于此 XML,以生成动态 MDX 查询。

请参阅

概念

定义 Analysis Services 事件提供程序

其他资源

Analysis Services 事件提供程序
定义事件提供程序
标准事件提供程序
MDX 中的重要概念 (MDX)

帮助和信息

获取 SQL Server 2005 帮助