共用方式為


Notification Services 的 MDX 查詢

多維度運算式 (MDX) 查詢的結果集可以有多個維度。不過,這個事件提供者需要其 MDX 查詢傳回一般資料列集,再以事件集將一般資料列集提交至 Notification Services 應用程式。

MDX 查詢必須傳回結果集,其中的資料行對應至事件類別欄位。第一個 MDX 結果資料行應該對應到第一個事件類別欄位,第二個 MDX 結果資料行應該對應到第二個事件類別欄位,以此類推。

Analysis Services 事件提供者的 MDX 查詢可以是靜態的。靜態表示您建立應用程式時,就已知完整的查詢。該 MDX 查詢也可以是動態的。動態表示 ROWS 軸的元素或是 MDX 查詢 slicer 的元素是藉由執行 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 Cube 選取三個量值。這些量值是結果集內的資料行。這項查詢會進一步限制為選取只關於這兩位員工的資料列:Ken J. Sánchez 和 Amy E. Alberts。

Order Time 維度上有多個 Tuple。因此,查詢會進一步限制 (或 slice) 僅顯示 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 應用程式,您可以只選取訂閱這個應用程式的員工資料。不過,由於員工可加入和刪除訂閱,因此在建立應用程式時不會有靜態查詢的固定清單。

您可以撰寫靜態查詢,讓查詢傳回每位員工是否訂閱的記錄。但如果 Cube 有上萬名員工,靜態查詢會每位員工傳回一個資料列。這將是一個包含不相關資料的大型事件批次。

您可以撰寫動態 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>

然後,您撰寫 XSL 轉換,將結果清單格式化成為完整 MDX 查詢。例如,轉換可以在 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 事件提供者使用這項查詢 (每次事件提供者執行時都會動態產生),來查詢 Cube 的事件資料。

在這個 XSL 轉換中,slicer.[Date].[Calendar].[CY 2002]) 是以硬式編碼寫至轉換中。Transact-SQL 查詢可利用 SlicerQuery 引數傳遞至 Analysis Services 事件提供者,來動態建立 WHERE 子句。

資料列查詢和 slicer 查詢的結果已結合至單一 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 協助