MDX-Abfragen für Notification Services

Das Resultset einer Abfrage mit multidimensionalen Ausdrücken (MDX, Multidimensional Expressions) kann mehrere Dimensionen aufweisen. Dieser Ereignisanbieter erfordert jedoch, dass seine MDX-Abfragen ein Flatrowset zurückgeben, das wiederum als Satz von Ereignissen an eine Notification Services-Anwendung übermittelt werden kann.

Die MDX-Abfrage muss ein Resultset mit Spalten zurückgeben, die den Ereignisklassenfeldern zugeordnet sind. Die erste Spalte des MDX-Ergebnisses sollte dem ersten Ereignisklassenfeld zugeordnet sein, die zweite Spalte des Ergebnisses sollte dem zweiten Ereignisklassenfeld zugeordnet sein usw.

MDX-Abfragen für den Analysis Services-Ereignisanbieter können statisch sein. Statisch bedeutet, dass die vollständige Abfrage bekannt ist, wenn Sie die Anwendung erstellen. Sie können jedoch auch dynamisch sein. Dynamisch bedeutet, dass die Elemente der ROWS-Achse oder Elemente des MDX-Abfrageslicers durch Ausführen von Transact-SQL-Abfragen abgerufen werden. Die Ergebnisse der Transact-SQL-Abfragen werden zum Generieren der endgültigen MDX-Abfrage mithilfe einer XSL-Transformation verwendet.

Statische MDX-Abfragen

Wenn Sie die genaue Abfrage kennen, die zum Abrufen von Daten für die Notification Services-Anwendung erforderlich ist, können Sie eine statische Abfrage schreiben. Notification Services führt genau diese Abfrage anhand des in der Anwendungsdefinition angegebenen Quantumzeitplanes aus.

Betrachten Sie die folgende Ereignisklassendefinition:

<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>

Es folgt ein Beispiel für eine statische MDX-Abfrage, die ein entsprechendes Ergebnis zurückgibt, das dieser Ereignisklasse zugeordnet wird:

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]

Diese Abfrage wählt drei Measures aus dem Adventure Works-Cube aus. Diese Measures sind die Spalten des Resultsets. Die Abfrage wird weiter eingeschränkt, um Zeilen auszuwählen, die nur zu zwei Mitarbeitern, Ken J. Sánchez und Amy E. Alberts, gehören.

In der Dimension Order Time befinden sich mehrere Tupel. Daher wird die Abfrage weiter eingeschränkt oder in "Slices" aufgeteilt, um nur das Jahr 2002 anzuzeigen.

Das endgültige Resultset ist eine Tabelle, die die Werte von Reseller Gross Profit Margin, Reseller Order Quantity und Reseller Sales Amount für die ausgewählten Mitarbeiter für das Jahr 2002 enthält.

  Reseller Gross Profit Margin Reseller Order Quantity Reseller Sales Amount

Ken J. Sánchez

1.34%

58,241

$24,144,429.65

Amy E. Alberts

4.68%

10,546

$3,457,549.94

Wenn Notification Services diese Abfrage ausführt, wird das zweidimensionale Resultset als Ereignisbatch an eine Ereignisklasse übermittelt.

Dynamische MDX-Abfragen

Für eine Notification Services-Anwendung möchten Sie möglicherweise nur Daten für Mitarbeiter auswählen, die die Anwendung abonniert haben. Beim Erstellen der Anwendung werden Sie jedoch nicht über eine feste Liste für eine statische Abfrage verfügen, da Mitarbeiter Abonnements hinzufügen und löschen können.

Sie könnten eine statische Abfrage schreiben, die einen Datensatz für jeden Mitarbeiter zurückgibt, unabhängig davon, ob dieser ein Abonnent ist oder nicht. Wenn ein Cube jedoch zehntausende Mitarbeiter enthält, würde eine statische Abfrage für jeden Mitarbeiter eine Zeile zurückgeben. Das ist ein großer Ereignisbatch, der irrelevante Daten enthält.

Sie können die Leistung der Anwendung wesentlich verbessern, indem Sie eine dynamische MDX-Abfrage schreiben. Betrachten Sie eine Abonnementklasse, für die folgendes Schema verwendet wird:

<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>

Zuerst schreiben Sie eine Transact-SQL-Abfrage, die eine Liste von Elementen auswählt, die von Interesse sind, wie z. B. Mitarbeiter:

SELECT EmployeeFullName as Employee
FROM NSKPISubscriptionsView

Diese Abfrage setzt voraus, dass der zweite Vorname im Vornamen enthalten ist.

Der Analysis Services-Ereignisanbieter erhält das Ergebnis dieser Transact-SQL-Abfrage in XML-Form, wobei jeder ausgewählte Spaltenname als Attribut eines Zeilenelements zurückgegeben wird:

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

Anschließend schreiben Sie eine XSL-Transformation, die die Ergebnisliste in die vollständige MDX-Abfrage formatiert. Beispielsweise kann die Transformation die bekannten Teile der Abfrage in match="rows" schreiben. Sie kann dann für jede Zeile den Wert in ein Element in der ON ROWS-Spezifikation der MDX-Abfrage transformieren. Verwenden Sie zum Transformieren des XML-Codes die folgende XSL-Transformation:

<?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>

Das Ergebnis dieser Transformation ist eine vollständige MDX-Abfrage:

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]

Der Analysis Services-Ereignisanbieter verwendet diese Abfrage, die bei jeder Ausführung des Ereignisanbieters dynamisch generiert wird, zum Abfragen von Ereignisdaten aus dem Cube.

In dieser XSL-Transformation ist der Slicer [Date].[Calendar].[CY 2002] in der Transformation hartcodiert. Eine Transact-SQL-Abfrage kann mithilfe des SlicerQuery-Arguments an den Analysis Services-Ereignisanbieter übergeben werden, um die WHERE-Klausel dynamisch zu erstellen.

Die Ergebnisse der Zeilenabfrage und der Slicerabfrage werden in einem einzelnen XML-Ergebnis kombiniert:

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

Auf diesen XML-Code wird die XSL-Transformation angewendet, um die dynamische MDX-Abfrage zu generieren.

Siehe auch

Konzepte

Definieren des Analysis Services-Ereignisanbieters

Andere Ressourcen

Analysis Services-Ereignisanbieter
Definieren von Ereignisanbietern
Standardereignisanbieter
Schlüsselkonzepte in MDX (MDX)

Hilfe und Informationen

Informationsquellen für SQL Server 2005