多維度運算式 (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 事件提供者
定義事件提供者
標準事件提供者
MDX 的關鍵概念 (MDX)