XML for Analysis Specification

 

Version 1.0

Microsoft Corporation
Hyperion Solutions Corporation

Zusammenfassung: Gibt eine SOAP-basierte XML-Kommunikations-API an, die den Austausch analytischer Daten zwischen Clients und Servern auf jeder Plattform und mit jeder Beliebigen Sprache unterstützt. (82 gedruckte Seiten)

Contents

Kurzfassung
Zielgruppe
Entwurfsziele
Entwurfszusammenfassung
Teil I – XML für die Analyse
Einführung in XML für die Analyse
Methoden
Datentypen, die in XML für die Analyse verwendet werden
XML für Analyserowsets
XML für Analysis-Eigenschaften
Fehlerbehandlung in XML für die Analyse
Unterstützung für zustandsbehaftete Daten in XML for Analysis
XML für die Analyse mit Data Mining
Teil II - Anlagen
Anhang A: Implementierungshinweise
Anhang B: Schnell-SOAP-Glossar
Anhang C: XML for Analysis to OLE DB Mapping
Anhang D: MDDataSet-Beispiel
Anhang E: Links zu referenzierten Technologien und Standards

Zusammenfassende Darstellung

XML for Analysis ist eine SOAP-basierte XML-API (Simple Object Access Protocol), die speziell für die Standardisierung der Datenzugriffsinteraktion zwischen einer Clientanwendung und einem Datenanbieter entwickelt wurde, der über das Web arbeitet.

Derzeit muss bei herkömmlichen Datenzugriffstechniken wie OLE DB und ODBC eine Clientkomponente, die eng mit dem Datenanbieterserver verknüpft ist, auf dem Clientcomputer installiert werden, damit eine Anwendung auf Daten von einem Datenanbieter zugreifen kann. Eng gekoppelte Clientkomponenten können Abhängigkeiten von einer bestimmten Hardwareplattform, einem bestimmten Betriebssystem, einem bestimmten Schnittstellenmodell, einer bestimmten Programmiersprache und einer bestimmten Übereinstimmung zwischen Versionen von Client- und Serverkomponenten erstellen.

Die Anforderung zum Installieren von Clientkomponenten und die Abhängigkeiten, die eng gekoppelten Architekturen zugeordnet sind, sind für die lose gekoppelte, zustandslose, plattformübergreifende und sprachunabhängige Umgebung des Internets ungeeignet. Um zuverlässigen Datenzugriff auf Webanwendungen zu ermöglichen, benötigen das Internet, mobile Geräte und plattformübergreifende Desktops eine Standardmethodik, die keine Komponentendownloads auf den Client erfordert.

XML (Extensible Markup Language) ist generisch und kann universell verwendet werden. Was wäre, wenn Sie statt einer proprietären Schnittstelle einer Clientkomponente Methoden aufrufen und Daten über XML-HTTP-Nachrichten ohne Clientkomponente übertragen könnten? Was wäre, wenn der Anwendungsentwickler Clientkomponenten erstellen könnte, ohne sich um eine enge Kopplung mit einer Serverkomponente oder -anwendung zu kümmern? Was wäre, wenn eine Anwendung, die mit einer beliebigen Programmiersprache entwickelt wurde und auf jeder Plattform ausgeführt wird, von jedem Ort im Web aus auf Daten zugreifen könnte, ohne eine bestimmte Plattformunterstützung oder sogar eine bestimmte Anbieterversion planen zu müssen? Diese Spezifikation beantwortet diese Fragen mit XML for Analysis.

XML for Analysis treibt die Konzepte von OLE DB voran, indem standardisierter universeller Datenzugriff auf jede Standarddatenquelle bereitgestellt wird, die sich über das Web befindet, ohne dass eine Clientkomponente bereitgestellt werden muss, die COM-Schnittstellen verfügbar macht. XML for Analysis wird für das Web optimiert, indem Roundtrips auf den Server minimiert und zustandslose Clientanforderungen verwendet werden, um die Skalierbarkeit und Stabilität einer Datenquelle zu maximieren.

Diese Spezifikation definiert die beiden Methoden Discover und Execute, die XML für zustandslose Datenermittlung und -manipulation nutzen und senden.

Die Spezifikation basiert auf den offenen Internetstandards HTTP, XML und SOAP und ist nicht an eine bestimmte Sprache oder Technologie gebunden. Die Spezifikation verweist auf OLE DB, sodass Anwendungsentwickler, die bereits mit OLE DB vertraut sind, sehen können, wie XML for Analysis zugeordnet und implementiert werden kann. Diese Verweise enthalten auch Hintergrundinformationen zu den OLE DB-Definitionen, die die Spezifikation erweitert.

Zielgruppe

Diese Spezifikation richtet sich an Anwendungsentwickler und setzt Folgendes voraus:

  • Xml-Kenntnisse
  • Kenntnisse über SOAP
  • Verständnis der analytischen Onlineverarbeitung (OLAP) und Data Mining
  • Kenntnisse zu OLE DB und OLE DB für OLAP

Weitere Informationen zu diesen Bereichen finden Sie in Anhang E.

Entwurfsziele

Die Hauptziele dieser Spezifikation umfassen Folgendes:

  • Bereitstellen einer Standard-Datenzugriffs-API für Remotedatenzugriffsanbieter, die universell im Internet oder Intranet für mehrdimensionale Daten verwendet werden kann
  • Optimieren einer zustandslosen Architektur ohne Clientkomponenten für das Web mit minimalen Roundtrips
  • Unterstützung von technologisch unabhängigen Implementierungen mit jedem Tool, jeder Programmiersprache, Technologie, Hardwareplattform oder jedem Gerät
  • Bauen Sie auf offenen Internetstandards wie SOAP, XML und HTTP auf.
  • Nutzen und Wiederverwenden erfolgreicher OLE DB-Entwurfskonzepte, damit OLE DB für OLAP-Anwendungen und OLE DB-Anbieter problemlos für XML for Analysis aktiviert werden kann
  • Effizientes Arbeiten mit Standarddatenquellen wie relationalem OLAP und Data Mining

Entwurfszusammenfassung

Der Entwurf konzentriert sich auf eine XML-basierte Kommunikations-API namens XML for Analysis, die zwei allgemein zugängliche Methoden definiert: Discover und Execute. Da XML eine lose verbundene Client- und Server-Architektur ermöglicht, wickeln beide Methoden eingehende und ausgehende Informationen im XML-Format ab. Diese API ist für das Internet optimiert, wo Roundtrips zum Server zeit- und ressourcenintensiv sind und zustandsbehaftete Verbindungen mit den Daten Benutzerverbindungen auf dem Server einschränken.

Discover wird verwendet, um Informationen und Metadaten aus einem Webdienst abzurufen. Diese Informationen können eine Liste verfügbarer Datenquellen und Daten zum Anbieter für eine bestimmte Datenquelle enthalten. Eigenschaften werden verwendet, um zu definieren und zu gestalten, welche Daten abgerufen werden. Die Clientanwendung benötigt möglicherweise viele Arten von Informationen. Mit Discover können Sie dies häufig angeben. Diese generische Schnittstelle und die Verwendung von Eigenschaften ermöglichen die Erweiterbarkeit, ohne vorhandene Funktionen neu zu schreiben.

Execute wird verwendet, um mehrdimensionale Ausdrücke (MDX) oder andere anbieterspezifische Befehle für eine bestimmte XML-Datenquelle für die Analyse auszuführen. Das folgende Diagramm veranschaulicht eine mögliche Implementierung einer n-schichtigen Anwendung.

Der Client wird mit der URL für einen Server bereitgestellt, auf dem ein Webdienst gehostet wird, und sendet Discover - und Execute-Aufrufe mithilfe der PROTOKOLLE SOAP und HTTP an den Server. Der Server instanziiert den XML for Analysis-Anbieter, der die Aufrufe Discover und Execute verarbeitet. Der XML for Analysis-Anbieter ruft die Daten ab, packt sie in XML und sendet dann die angeforderten Daten als XML an den Client.

Mit den Discover - und Execute-Methoden können Benutzer bestimmen, was auf einem bestimmten Server abgefragt werden kann, und basierend darauf die auszuführenden Befehle übermitteln. Im folgenden Szenario wird veranschaulicht, wie eine Internetanwendung oder ein Webdienst diese Methoden verwenden kann.

Teil I – XML für die Analyse

Einführung in XML für die Analyse

XML for Analysis gibt eine SOAP-basierte XML-Kommunikations-API an, die den Austausch von analytischen Daten zwischen Clients und Servern auf jeder Plattform und mit jeder Sprache unterstützt.

Methoden

Die folgenden Methoden bieten eine Standardmethode für XML-Anwendungen, um auf grundlegende Informationen vom Server zuzugreifen. Da diese Methoden mithilfe des SOAP-Protokolls aufgerufen werden, akzeptieren sie Eingaben und liefern die Ausgabe in XML. Standardmäßig sind diese Methoden zustandslos, sodass der Serverkontext mit dem Abschluss eines beliebigen Befehls endet. Informationen zum Ausführen zustandsbehafteter Aufrufe finden Sie unter Unterstützung für Zustandserreichung in XML for Analysis.

Das vereinfachte Schnittstellenmodell verfügt über zwei Methoden. Die Discover-Methode ruft Informationen ab, und die Execute-Methode sendet Aktionsanforderungen an einen Server. Der XML-Namespace für diese Methoden lautet "urn:schemas-microsoft-com:xml-analysis".

Verbindungsinformationen werden in jedem Methodenaufruf mit den Verbindungseigenschaften bereitgestellt.

Entdecken

Die Discover-Methode kann verwendet werden, um Informationen abzurufen, z. B. die Liste der verfügbaren Datenquellen auf einem Server oder Details zu einer bestimmten Datenquelle. Die mit der Discover -Methode abgerufenen Daten hängen von den Werten der an sie übergebenen Parameter ab.

Namespace

urn:schemas-microsoft-com:xml-analysis

SOAP-Aktion

"urn:schemas-microsoft-com:xml-analysis:Discover"

Syntax

Discover (
   [in] RequestType As EnumString,
   [in] Restrictions As Restrictions,
   [in] Properties As Properties,
   [out] Result As Rowset)

Parameter

  • RequestType [in]
    Dieser erforderliche Parameter besteht aus einem RequestTypes-Enumerationswert, der den Typ der zurückzugebenden Informationen bestimmt. Die RequestTypes-Enumeration wird von der Discover-Methode verwendet, um die Struktur und den Inhalt des im Result-Parameter zurückgegebenen Rowsets zu bestimmen. Das Format des Parameters Restrictions und des resultierenden XML-Resultsets ist ebenfalls vom in diesem Parameter angegebenen Wert abhängig. Diese Enumeration kann erweitert werden, um anbieterspezifische Enumerationszeichenfolgen zu unterstützen.

    Jeder RequestTypes-Enumerationswert entspricht einem Rückgaberowset. Rowsetdefinitionen finden Sie unter XML for Analysis Rowsets. Unterstützung ist für die folgenden explizit benannten RequestTypes-Enumerationswerte erforderlich.

    Enumerationswert BESCHREIBUNG
    DISCOVER_DATASOURCES Gibt eine Liste von XML for Analysis-Datenquellen zurück, die auf dem Server oder Webdienst verfügbar sind. (Ein Beispiel dafür, wie diese veröffentlicht werden können, finden Sie unter Exemplarische Vorgehensweise zur Implementierung von XML for Analysis.)
    DISCOVER_PROPERTIES Gibt eine Liste von Informationen und Werten zu den angeforderten Eigenschaften zurück, die von der angegebenen Datenquelle (Anbieter) unterstützt werden.
    DISCOVER_SCHEMA_ROWSETS Gibt die Namen, Werte und andere Informationen aller unterstützten RequestTypes-Enumerationswerte (einschließlich der hier aufgeführten) und alle zusätzlichen anbieterspezifischen Enumerationswerte zurück.
    DISCOVER_ENUMERATORS Gibt eine Liste von Namen, Datentypen und Enumerationswerten von Enumeratoren zurück, die vom Anbieter einer bestimmten Datenquelle unterstützt werden.
    DISCOVER_KEYWORDS Gibt ein Rowset zurück, das eine Liste von Schlüsselwörtern enthält, die vom Anbieter reserviert sind.
    DISCOVER_LITERALS Gibt Informationen zu Literalen zurück, die vom Datenquellenanbieter unterstützt werden.
    Schemarowsetkonstante Bei einer Konstante, die einem der von OLE DB definierten Schemarowsetnamen entspricht, z. B. MDSCHEMA_CUBES, gibt das OLE DB-Schemarowset im XML-Format zurück. Beachten Sie, dass Anbieter OLEDB auch erweitern können, indem sie zusätzliche anbieterspezifische Schemarowsets bereitstellen. Die Schemarowsets, die tabellarische Datenanbieter (TDP) und mehrdimensionale Datenanbieter (MDP) unterstützen müssen, sind im Abschnitt DISCOVER_SCHEMA_ROWSETS Rowset aufgeführt.
  • Einschränkungen [in]
    Dieser Parameter des Datentyps Einschränkungen ermöglicht es dem Benutzer, die in Result zurückgegebenen Daten einzuschränken. Die Ergebnisspalten werden durch das im RequestType-Parameter angegebene Rowset definiert. Einige Spalten von Result können verwendet werden, um die zurückgegebenen Zeilen zu filtern. Informationen zu diesen und eingeschränkten Spalten finden Sie in den Rowsettabellen in XML for Analysis Rowsets. Verwenden Sie zum Abrufen der Einschränkungsinformationen für anbieterspezifische Schemarowsets den DISCOVER_SCHEMA_ROWSETS Anforderungstyp.

    Dieser Parameter muss enthalten sein, kann aber leer sein.

  • Eigenschaften [in]
    Dieser Parameter des Datentyps Properties besteht aus einer Auflistung von XML for Analysis-Eigenschaften. Jede Eigenschaft ermöglicht es dem Benutzer, einige Aspekte der Discover-Methode zu steuern, z. B. das Rückgabeformat des Resultsets, das Timeout und das Gebietsschema, in dem die Daten formatiert werden sollen.

    Die benötigten Eigenschaften und ihre Werte können über eine Nutzung des Anforderungstyps DISCOVER_PROPERTIES mit der Discover -Methode abgerufen werden. Standard-XML für Analysis-Eigenschaften sind in XML for Analysis Properties (XML for Analysis Properties) ausführlich beschrieben.

    Es ist keine erforderliche Reihenfolge für die im Properties-Parameter aufgeführten Eigenschaften erforderlich. Dieser Parameter muss enthalten sein, kann aber leer sein.

  • Ergebnis [out]
    Dieser erforderliche Parameter enthält das Resultset, das vom Anbieter als Rowsetobjekt zurückgegeben wird.

    Die Spalten und der Inhalt des Resultsets werden durch die Werte angegeben, die in den Parametern RequestType und Restrictions angegeben sind. Das Spaltenlayout des zurückgegebenen Resultsets wird auch durch den in RequestType angegebenen Wert bestimmt. Weitere Informationen zu den Rowsetlayouts, die für jeden RequestType-Wert entsprechen, finden Sie unter XML for Analysis Rowsets.

Weitere Informationen zum Rowsetdatentyp finden Sie unter Datentypen, die in XML für die Analyse verwendet werden.

Beispiel

Im folgenden Beispiel sendet der Client den XML-Ermittlungsaufruf , um eine Liste von Cubes aus dem FoodMart 2000-Katalog anzufordern:

  <Discover xmlns="urn:schemas-microsoft-com:xml-analysis" 
  SOAP-ENV:encodingStyle="https://schemas.xmlsoap.org/soap/encoding/">
   <RequestType>MDSCHEMA_CUBES</RequestType>
   <Restrictions>
    <RestrictionList>
     <CATALOG_NAME>
      FoodMart 2000
     </CATALOG_NAME>
    </RestrictionList>
   </Restrictions>
   <Properties>
    <PropertyList>
     <DataSourceInfo>
      Provider=MSOLAP;Data Source=local;
     </DataSourceInfo>
     <Catalog>
      Foodmart 2000
     </Catalog>
     <Format>
      Tabular
     </Format>
    </PropertyList>
   </Properties>
  </Discover>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Der Anbieter gibt das folgende Ergebnis an den Client zurück:

<?xml version="1.0"?>
<SOAP-ENV:Envelope
 xmlns:SOAP-ENV="https://schemas.xmlsoap.org/soap/envelope/"
 SOAP-ENV:encodingStyle="https://schemas.xmlsoap.org/soap/encoding/">
 <SOAP-ENV:Body>
  <DiscoverResponse xmlns="urn:schemas-microsoft-com:xml-analysis">
   <return>
    <root>
     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <!-- The XML schema definition of the result comes here -->
      ...
     </xsd:schema>
     <row>
      <CATALOG_NAME>FoodMart 2000</CATALOG_NAME>
      <CUBE_NAME>Sales</CUBE_NAME>
      ...
     </row>
     <row>
      <CATALOG_NAME>FoodMart 2000</CATALOG_NAME>
      <CUBE_NAME>Warehouse</CUBE_NAME>
      ...
     </row>
     ...
    </root>
   </return>
  </DiscoverResponse>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Execute

Die Execute-Methode wird zum Senden von Aktionsanforderungen an den Server verwendet. Dies schließt Anforderungen im Zusammenhang mit Datenübertragung ein, z. B. das Abrufen oder Aktualisieren von Daten auf dem Server.

Namespace

urn:schemas-microsoft-com:xml-analysis 

SOAP-Aktion

"urn:schemas-microsoft-com:xml-analysis:Execute"

Syntax

Execute (
   [in] Command As Command,
   [in] Properties As Properties,
   [out] Result As Resultset)

Parameter

  • Befehl [in]
    Dieser erforderliche Parameter ist vom Befehlsdatentyp und besteht aus einer anbieterspezifischen Anweisung, die ausgeführt werden soll. Mehrdimensionale XML for Analysis-Anbieter müssen die MdXML-Sprache unterstützen, können aber bei Bedarf auch andere Befehle unterstützen.

  • Eigenschaften [in]
    Dieser Parameter ist vom Datentyp Properties und besteht aus einer Auflistung von XML for Analysis-Eigenschaften. Jede Eigenschaft ermöglicht es dem Benutzer, einen Aspekt der Execute-Methode zu steuern, z. B. das Definieren der für die Verbindung erforderlichen Informationen, das Angeben des Rückgabeformats des Resultsets oder das Gebietsschema, in dem die Daten formatiert werden sollen.

    Die benötigten Eigenschaften und ihre Werte können über eine Nutzung des Anforderungstyps DISCOVER_PROPERTIES mit der Discover -Methode abgerufen werden. Standard-XML für Analysis-Eigenschaften sind in XML for Analysis Properties (XML for Analysis Properties) ausführlich beschrieben.

    Es ist keine erforderliche Reihenfolge für die im Properties-Parameter aufgeführten Eigenschaften erforderlich. Dieser Parameter muss enthalten sein, kann aber leer sein.

  • Ergebnis [out]
    Dieser Parameter enthält das Resultset-Ergebnis , das vom Anbieter zurückgegeben wird. Der Command-Parameter und die Werte im Parameter Properties definieren die Form des Resultsets. Wenn keine shape-definierenden Eigenschaften übergeben werden, verwendet der XML for Analysis-Anbieter möglicherweise eine Standardform.

    Die beiden von dieser Spezifikation definierten Resultsetformate sind Tabellarische und mehrdimensionale Formate, wie vom Client über die Format-Eigenschaft angegeben. OLAP-Daten eignen sich für das mehrdimensionale Format (obwohl auch das tabellarische Format verwendet werden kann). Ein Anbieter unterstützt möglicherweise zusätzliche Rowsettypen, und Clients, die die spezialisierten Typen kennen, können diese anfordern.

Beispiel

Im Folgenden ist ein Beispiel für einen Execute-Methodenaufruf aufgeführt, bei dem <Statement> auf eine OLAP MDX SELECT-Anweisung festgelegt ist:

  <Execute xmlns="urn:schemas-microsoft-com:xml-analysis" 
  SOAP-ENV:encodingStyle="https://schemas.xmlsoap.org/soap/encoding/">
   <Command>
    <Statement>
     select [Measures].members on Columns from Sales
    </Statement>
   <Command>
   <Properties>
    <PropertyList>
     <DataSourceInfo>
Provider=Essbase;Data Source=local;
     </DataSourceInfo>
     <Catalog>Foodmart 2000</Catalog>
     <Format>Multidimensional</Format>
     <AxisFormat>ClusterFormat</AxisFormat>
    </PropertyList>
   </Properties>
  </Execute>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Dies ist die abgekürzte Antwort für den vorherigen Methodenaufruf:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:
 SOAP-ENV="https://schemas.xmlsoap.org/soap/envelope/" 
 SOAP-ENV:encodingStyle=
 "https://schemas.xmlsoap.org/soap/encoding/"> 
  <SOAP-ENV:Body>  
  <m:ExecuteResponse 
  xmlns:m="urn:schemas-microsoft-com:xml-analysis">  
  <m:return  SOAP-ENV:encodingStyle=
  "https://schemas.xmlsoap.org/soap/encoding/">
    <root>    
      <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:xars="urn:schemas-microsoft-com:xars">
        ...<!—The schema for the data goes here. -- >
      </xsd:schema>
        ... <!—The data in MDDataSet format goes here. -- >
    </root>  
  </m:return>  
  </m:ExecuteResponse> 
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Datentypen, die in XML für die Analyse verwendet werden

In der folgenden alphabetischen Liste werden XML for Analysis-Datentypen beschrieben, und es werden die Datentypen aufgeführt, die XML-Standarddatentypen verwenden. Weitere Informationen zu den XML-Schematypen finden Sie unter http://www.w3.org/TR/xmlschema-2/.

Boolean

Der boolesche Typ verwendet den booleschen Standarddatentyp XML.

Der boolesche XML-Datentyp verwendet 1 für True und 0 für False.

Decimal

Der notierte Decimal-Typ verwendet den standardmäßigen XML-Dezimaldatentyp.

Integer

Der in diesem Dokument notierte Integer-Typ bezieht sich auf den Xml-Standarddatentyp int.

EnumString

Der EnumString-Datentyp definiert einen Satz benannter Konstanten für einen bestimmten Enumerator (Enumerator). EnumString verwendet den standardmäßig string -XML-Datentyp. Die bestimmten Werte für jede der genannten Konstanten werden mit der Enumeratordefinition angegeben.

MDDataSet

Das MDDataSet-Format ist eines der Formate, die im Result-Parameter der Execute-Methode zurückgegeben werden können. Diese wird für mehrdimensionale Daten verwendet. Für die Darstellung von OLAP-Daten in XML ist ein OLAP-orientiertes Rowset (oder Dataset) erforderlich. Der XML-Namespace für den MDDataSet-Datentyp ist "urn:schemas-microsoft-com:xml-analysis:mddataset ".

Grundlegende Informationen zu den OLE DB für OLAP-Datasetstrukturen finden Sie unter MDDataset-Datentypzuordnung zu OLE DB. Ein vollständiges Beispiel für die XML-Schemadefinition (XSD) des MDDataSet finden Sie unter Anhang D.

Diese Spezifikation definiert die folgende XML-Struktur für OLAP-Ergebnisse. Ein MDDataSet besteht aus den folgenden Standard Abschnitten:

  • OLAPInfo: Definiert die Struktur des Ergebnisses und listet die Achsen und Zellen auf, die folgen sollen.
  • Achsen: Enthält die In der OLAPInfo-Struktur definierten Daten für die Achsen.
  • CellData: Enthält die Daten für die Zellen, die in der OLAPInfo-Struktur definiert sind

Anbieter können der Struktur zusätzliche Anmerkungen hinzufügen, solange sie das Verhalten und die Bedeutung des hier definierten Schemas nicht ändern. Mit diesem offenen Inhaltsschemamodell können neue Elemente und Attribute aus anderen Namespaces hinzugefügt werden, die Semantik definierter Elemente und Attribute kann jedoch nicht geändert werden.

Olapinfo

Um die Struktur zu definieren, <definiert OlapInfo> zunächst Achsen mithilfe des <AxesInfo-Elements> (beachten Sie den Plural Axes). Axes besteht aus einer Reihe von <AxisInfo-Elementen> (beachten Sie den Singular Axis), der einen Alias für eine Ordnungszahl aufweist, z . B. name="Axis0". Die Dimensionshierarchien werden dann mit ihren Eigenschaftendefinitionen aufgelistet. Im folgenden Beispiel werden die Standardelementeigenschaften im <HierarchyInfo-Element> durch UName, Caption, LName und LNum sowie das nicht standardmäßige DisplayInfo-Element dargestellt. Für die Store-Hierarchie die zusätzliche (nicht standardmäßige) Membereigenschaft mit dem Leerzeichen [Store]. [Store SQFT] wird veranschaulicht.

<OlapInfo>
   <AxesInfo>
      <AxisInfo name="Axis0">
         <HierarchyInfo name="Measures">
            <UName name="[Measures].[MEMBER_UNIQUE_NAME]"></UName>
               <Caption name="[Measures].[MEMBER_CAPTION]"></Caption>
                  <LName name="[Measures].[LEVEL_UNIQUE_NAME]"></LName>
                     <LNum name="[Measures].[LEVEL_NUMBER]"></LNum>
                        <DisplayInfo name="[Measures].[DISPLAY_INFO]"></DisplayInfo>
                  </HierarchyInfo>
               </AxisInfo> 
                  <AxisInfo name="Axis1">
                     <HierarchyInfo name="Store">
                            <UName name="[Store].[MEMBER_UNIQUE_NAME]"></UName>
                           <Caption name="[Store].[MEMBER_CAPTION]"></Caption>
                           <LName name="[Store].[LEVEL_UNIQUE_NAME]"></LName>
                           <LNum name="[Store].[LEVEL_NUMBER]"></LNum>
                           <DisplayInfo name="[Store].[DISPLAY_INFO]"></DisplayInfo>
                           <Store_x0020_SQFT name="[Store].[Store Name].[Store SQFT]"></Store_x0020_SQFT>
                     </HierarchyInfo>
                     <HierarchyInfo name="Time">
                           <UName name="[Time].[MEMBER_UNIQUE_NAME]"></UName>
                           <Caption name="[Time].[MEMBER_CAPTION]"></Caption>
                           <LName name="[Time].[LEVEL_UNIQUE_NAME]"></LName>
                           <LNum name="[Time].[LEVEL_NUMBER]"></LNum>
                           <DisplayInfo name="[Time].[DISPLAY_INFO]"></DisplayInfo>
                     </HierarchyInfo>
                   </AxisInfo>

Das letzte, was durch die OLAPInfo-Struktur definiert wird, sind die Eigenschaften (Spaltendefinitionen) für die Zellen. Dadurch können Zellen zusätzliche Eigenschaften enthalten. Die Eigenschaften in diesem Beispiel sind Value, FmtValue und die benutzerdefinierte Eigenschaft FormatString.

<OlapInfo>
 ...
            <CellInfo>
                  <Value name="VALUE"></Value>
                  <FmtValue name="FORMATTED_VALUE"></FmtValue>
                  <FormatString name="FORMAT_STRING"></FormatString>
            </CellInfo>

HierarchyInfo-Standardelemente

Die folgenden Standardelemente sind für das <HierarchyInfo-Element> erforderlich. MDSCHEMA-Verweise beziehen sich auf die OLE DB für OLAP-Schemadefinition.

Element BESCHREIBUNG
Uname MEMBER_UNIQUE_NAME-Eigenschaft des OLE DB-Achsenrowsets
Caption MEMBER_CAPTION-Eigenschaft aus dem OLE DB-Achsenrowset
LName LEVEL_UNIQUE_NAME-Eigenschaft des OLE DB-Achsenrowsets
LNum LEVEL_NUMBER-Eigenschaft des OLE DB-Achsenrowsets

CellInfo-Standardelemente

Im Folgenden sind die Standardelemente für das <CellInfo-Element> aufgeführt. Ob sie für eine bestimmte Abfrage zurückgegeben werden, hängt von der Abfrage selbst ab.

Element BESCHREIBUNG
Wert VALUE-Eigenschaft aus OLE DB-Zelleneigenschaften
FmtValue FORMATTED_VALUE-Eigenschaft aus OLE DB-Zelleneigenschaften
ForeColor FORE_COLOR-Eigenschaft aus OLE DB-Zelleneigenschaften
BackColor BACK_COLOR-Eigenschaft aus OLE DB-Zelleneigenschaften

Verwenden von Standardwerten in CellInfo und AxisInfo

Optional können Anbieter Standardwerte für einzelne Elemente oder Zelleneigenschaften im AxisInfo - oder CellInfo -Abschnitt angeben. Wenn dieselbe Eigenschaft immer oder fast immer den gleichen Wert hat, kann dies die Größe im Ergebnis sparen.

Das <Default-Element> kann optional als Unterelement eines der Element- oder Zelleigenschaftselemente angegeben werden, um einen Standardwert für diese Eigenschaft anzugeben. Wenn der Anbieter für instance einen Standardwert für Store SQFT angeben möchte, wird er wie folgt angegeben:

<Store_x0020_SQFT name="Store SQFT">
 <Default>5000</Default>
</Store_x0020_SQFT>

Daher gibt das Fehlen einer Member- oder Zelleigenschaft im Ergebnis an, dass der angegebene Standardwert der Wert für die Membereigenschaft oder die Zelleigenschaft ist. Im folgenden Ergebnis, in dem die Ausgabe für das <Store x0020 SQFT-Element> vollständig fehlt, ist der Wert für <Store x0020 SQFT> 5000 (der Standardwert, der oben definiert wurde):

<Member Hierarchy="Store">
      <UName>[Store].[CA]</UName>
      <Caption>CA</Caption>
      <LName>[Store].[State]</LName>
      <LNum>2</LNum>
</Member>

Wenn das Element vorhanden ist, aber keinen Wert hat, impliziert dies ein leeres Zeichenfolgenergebnis (""), wie im folgenden Beispiel gezeigt:

<Store_x0020_SQFT />

Wenn eine Eigenschaft NULL ist, wird sie in der Regel einfach weggelassen. Wenn jedoch ein Standardwert für eine Eigenschaft definiert wurde, verwenden Sie das NULL-Attribut aus der XML-Schemaspezifikation wie folgt, um einen NULL-Wert für eine Eigenschaft anzugeben:

<Store_x0020_SQFT xsi:null='true' />

Achsen

Unter Achsen werden die Achsenelemente in der Reihenfolge aufgeführt, in der sie im Dataset auftreten, beginnend bei Null. Die Einstellung der AxisFormat-Eigenschaft bestimmt, wie Axis-Elemente formatiert werden. Alle XML for Analysis-Anbieter müssen die folgenden Werte für die AxisFormat-Eigenschaft unterstützen:

  • ClusterFormat
  • TupleFormat
  • CustomFormat

Die Unterstützung des CustomFormat-Werts als eindeutiges Format ist für einen Anbieter optional. Wenn ein Client CustomFormat anfordert, kann der Anbieter nach eigenem Ermessen eines der Formate TupleFormat und ClusterFormat zurückgeben. Während Anbieter alle drei der oben genannten Werte unterstützen müssen, können Clients das gewünschte Format anfordern. Aus diesem Grund können Clients entscheiden, nicht alle drei verfügbaren Formate zu verwenden.

Warum unterschiedliche Formate?

Die Einstellungen TupleFormat und ClusterFormat für die AxisFormat-Eigenschaft bieten zwei verschiedene Möglichkeiten, Tupel darzustellen. Die MDDataset-Definition bietet dem Anbieter zwei Möglichkeiten, Tupel als mehrdimensionale Tupel oder als kartesisches Produkt anzugeben. Dies bietet einer Clientanwendung die Wahl zwischen Einfachheit und Minimierung des Speicherplatzbedarfs.

Eine Achse stellt eine Reihe von Tupeln dar, wobei alle Tupel in der Menge die gleiche Dimensionalität aufweisen. Eine Menge kann auf verschiedene Weisen dargestellt werden, die unterschiedliche Vorteile bieten. Beispielsweise kann die folgende Menge aus vier Tupeln als Auflistung zweidimensionaler Tupel oder als kartesisches Produkt zweidimensionaler Mengen dargestellt werden.

1999 1999 2000 2000
Tatsächlich Budget Tatsächlich Budget

Die folgende Zeile stellt den Satz von vier Tupeln als Auflistung von zweidimensionalen Tupeln dar:

{ ( 1999, Actual ), ( 1999, Budget ), ( 2000, Actual ), ( 2000, Budget ) }

Die folgende Zeile stellt den Satz von vier Tupeln als kartesisches Produkt aus zwei eindimensionalen Mengen dar:

{ 1999, 2000 } x { Actual, Budget }

Beide Darstellungen haben Vor- und Nachteile. Zweidimensionale Tupel sind für Clienttools einfacher zu verwenden. Ein kartesisches Produkt eindimensionaler Mengen verwendet weniger Platz und behält die mehrdimensionale Natur der Menge bei.

In der folgenden Tabelle sind Vorgänge aufgelistet, die zum Definieren und Charakterisieren der Struktur und der Elemente einer Achse verwendet werden können.

Vorgang BESCHREIBUNG
Member Die kleinste Einheit einer Achse, die den Member einer Dimensionshierarchie darstellt
Tupel Ein Vektor von Membern aus verschiedenen Dimensionshierarchien
Members Ein Satz von Memberobjekten aus derselben Dimensionshierarchie
Tupel Eine Auflistung von Tupelobjekten mit der gleichen Dimensionalität
Union Eine Vereinigung von Sätzen
CrossProduct Ein kartesisches Produkt von Sets

Basierend auf dem vorherigen Beispiel übersetzen diese Vorgänge die zweidimensionalen Tupel und das kartesische Produkt eindimensionaler Mengen wie folgt.

Zweidimensionale Tupel

Tuples ( 
Tuple( Member(1999), Member(Actual) ), 
Tuple( Member(1999), Member(Budget) ), 
Tuple( Member(2000), Member(Actual) ), 
Tuple( Member(2000), Member(Budget) ) 
)

Kartesisches Produkt eindimensionaler Mengen

CrossProduct ( 
Members (Member(1999), Member(2000) ), 
Members (Member(Actual), Member(Budget) ) 
)

Die XML-Darstellung dieser Vorgänge folgt diesen Regeln (wobei sich member_properties Wert auf die Liste der Membereigenschaften bezieht, die im entsprechenden AxisInfo-Abschnitt definiert sind):

Member : <Member>member_properties</Member>

Tupel : <Tupel>member_list</Tupel>

set : <Member>member_list</Members>

set : <Tupel>tuple_list</Tupel>

set : <CrossProduct>set_list</CrossProduct>

set : <Union>set_list</Union>

member_list : Member [ Member ... ]

tuple_list : Tupel [ Tupel ... ]

set_list : set [ set ... ]

Wie oben gezeigt, kann dieselbe Gruppe unterschiedliche Darstellungen mit unterschiedlichen Vorgängen aufweisen. Der Client kann mithilfe der AxisFormat-Eigenschaft eine bestimmte Darstellung anfordern.

TupleFormat

In TupleFormat wird eine Achse als Gruppe von Tupeln dargestellt. Die folgenden Vorgänge müssen in der angegebenen Reihenfolge verwendet werden:

<Axis>
      <Tuples>
            <Tuple>
                  <Member Hierarchy="name">

Darüber hinaus <müssen Member-Elemente> über das Hierarchy-Attribut verfügen, das den Hierarchienamen des Elements angibt.

Im folgenden Beispiel wird das TupleFormat veranschaulicht.

1999 1999 2000
Tatsächlich Budget Budget
<Axes>
 <Axis name="Axis0">   
  <Tuples>
   <Tuple>
    <Member Hierarchy="Time">
     <UName>[Time].[1999]</UName>
     …
    </Member>
    <Member Hierarchy="Category">
     <UName>[Scenario].[Actual]</UName>
     …
    </Member>
   </Tuple>
   <Tuple>
    <Member Hierarchy="Time">
     <UName>[Time].[1999]</UName>
     …
    </Member>
    <Member Hierarchy="Category">
     <UName>[Scenario].[Budget]</UName>
     …
    </Member>
   </Tuple>
   <Tuple>
    <Member Hierarchy="Time">
     <UName>[Time].[2000]</UName>
     …
    </Member>
    <Member Hierarchy="Category">
     <UName>[Scenario].[Budget]</UName>
     …
    </Member>
   </Tuple>
  </Tuples>
 </Axis>
 ...
</Axes>

ClusterFormat

In ClusterFormat wird eine Achse als Gruppe von Clustern dargestellt. Jeder Cluster stellt ein Kreuzprodukt von Elementen aus unterschiedlichen Dimensionshierarchien dar. Anbieter definieren ihre eigenen anbieterspezifischen Clusteringalgorithmen. Die folgenden Vorgänge müssen in der angegebenen Reihenfolge verwendet werden:

<Axis>
 <CrossProduct Size="size">
  <Members Hierarchy="name">
   <Member>

Zum Darstellen von Objekten als Cluster muss das <CrossProduct-Element> über ein Size-Attribut verfügen, das die Anzahl von Tupeln angibt, die sich aus dem Produkt einzelner Membersätze innerhalb des CrossProduct ergeben. Das <Members-Element> muss über ein Hierarchy-Attribut verfügen, das den Dimensionshierarchienamen aller Member im Satz angibt.

Ein Kreuzprodukt kann Elemente aus einer einzelnen Dimensionshierarchie enthalten.

Das folgende Beispiel veranschaulicht zwei Cluster:

1999 1999 2000 2000 2001
Tatsächlich Budget Tatsächlich Budget Budget
Cluster 1 Cluster 2
<Axes>
 <Axis name="Axis0">
  <CrossProduct Size = "4">
   <Members Hierarchy="Time">
    <Member>
     <UName>[Time].[1999]</UName>
     …
    </Member>
    <Member>
     <UName>[Time].[2000]</UName>
     …
    </Member>
   </Members>
   <Members Hierarchy="Category">
    <Member>
     <UName>[Scenario].[Actual]</UName>
     …
    </Member>
    <Member>
     <UName>[Scenario].[Budget]</UName>
     …
    </Member>
   </Members>
  </CrossProduct>
  <CrossProduct Size = "1">
   <Members Hierarchy="Time">
    <Member>
     <UName>[Time].[2001]</UName>
     …
    </Member>
   </Members>
   <Members Hierarchy="Category">
    <Member>
     <UName>[Scenario].[Budget]</UName>
     …
    </Member>
   </Members>
  </CrossProduct>
 </Axis>
 …
</Axes>

CustomFormat

CustomFormat ermöglicht es dem Anbieter, die Achsen in einer beliebigen gültigen Kombination der in den obigen Abschnitten definierten Vorgänge mit den folgenden Einschränkungen zu generieren:

  • Nur <Union>-, <CrossProduct>-, <Member>- und <Tupelelemente> können als erstes untergeordnetes Element einer Achse auftreten.
  • Ein <Member-Element> unter dem <Tupel-Element> muss ein Hierarchy-Attribut enthalten, das den Namen der Hierarchie angibt, zu der das Element gehört.
  • Ein <Members-Element> muss ein Hierarchy-Attribut enthalten, das den Hierarchienamen aller Member in der Gruppe angibt.

CustomFormat bietet einem Anbieter die größte Flexibilität und Leistung, um die Achsendarstellung zu optimieren.

Dieser Abschnitt ist ein Beispiel dafür, was ein Anbieter für CustomFormat zurückgeben kann.

WA WA CA CA
Umbrella Umbrella Sonnenbrille Sonnenbrille
Tatsächlich Budget Tatsächlich Budget

Ein Anbieter kann die folgende Darstellung für das CustomFormat-Ergebnis generieren. In diesem Beispiel wird eine Reihe von Tupeln mit einer Gruppe von Elementen gekreuzt.

CrossProduct( 
Tuples ( 
Tuple ( Member(WA), Member(Umbrella) ), 
Tuple ( Member(CA), Member(Sunglasses) ) ), 
     Members ( Member(Actual), Member(Budget) ) 
)

Die obige theoretische Formulierung kann in XML wie folgt dargestellt werden:

<Axis name="Axis0">
 <CrossProduct>
  <Tuples>
   <Tuple>
    <Member Hierarchy="Store">
<UName>[Store].[WA]</UName>
...
</Member>
    <Member Hierarchy="Product">
<UName>[Product].[Umbrella]</UName>
...
</Member>
   </Tuple>
   <Tuple>
    <Member Hierarchy="Store">
<UName>[Store].[CA]</UName>
...
</Member>
    <Member Hierarchy="Product">
<UName>[Product].[Sunglasses]</UName>
...
</Member>
   </Tuple>
  </Tuples>
  <Members Hierarchy="Category">
  <Member>
  <UName>[Category].[Actual]</UName>
  ...
  </Member>
  <Member>
  <UName>[Category].[Budget]</UName>
  ...
  </Member>
  </Members>
 </CrossProduct>
</Axis>

CellData

Auf den Abschnitt Axes folgt der Abschnitt CellData, der die Eigenschaftenwerte für jede Zelle enthält. Ein obligatorisches CellOrdinal-Attribut gibt die Ordnungszahl der Zelle an. CellOrdinalist für n Zellen 0 bis n-1 nummeriert. Zellelemente können fehlen, wenn alle Zelleigenschaften der Standardwert sind (NULL ist der Standardwert, wenn kein Standardwert angegeben wurde). Beachten Sie, dass der Typ des <Value-Elements> im Abschnitt CellData angegeben werden muss, während für andere Standardeigenschaften, deren Typ im Schema definiert ist, kein Typ angegeben sein muss.

   <CellData>
      <Cell CellOrdinal="0">
         <Value xsi:type="xsd:double">16890</Value>
         <FmtValue>16,890.00</FmtValue>
         <FormatString>Standard</FormatString>
      </Cell>
      <Cell CellOrdinal="1">
         <Value xsi:type="xsd:int">50</Value>
         <FmtValue>50</FmtValue>
         <FormatString>Standard</FormatString>
      </Cell>
      <Cell CellOrdinal="2">
         <Value xsi:type="xsd:double">36175.2</Value>
         <FmtValue>$36,175.20</FmtValue>
         <FormatString>Currency</FormatString>
      </Cell>
   </CellData>

Der Achsenbezug für eine Zelle kann basierend auf CellOrdinal berechnet werden. Konzeptionell werden Zellen in einem Dataset so nummeriert, als wäre das Dataset ein p-dimensionales Array, wobei p die Anzahl der Achsen ist. Die Zellen werden in zeilengerichteter Reihenfolge adressiert. Die folgende Abbildung zeigt die Formel für die Berechnung der Ordinalzahl einer Zelle.

Wir wenden die obige Formel auf das In der folgenden Tabelle gezeigte Resultset an. In der Abfrage wurden vier Measures für Spalten und eine Kreuzung aus zwei Zuständen mit vier Quartalen für Zeilen angefordert. Im Nachfolgen des Datasetergebnisses ist die CellOrdinal-Eigenschaft für den im Feld angezeigten Teil des Datasetergebnisses der Satz {9, 10, 11, 13, 14, 15, 17, 18, 19}. Dies liegt daran, dass die Zellen in Zeilen-Hauptreihenfolge nummeriert sind, beginnend mit einem CellOrdinal von 0 von 0 für die obere linke Zelle.

Als Nächstes wenden wir die obige Formel auf die Zelle {CA, Q3, Store Cost} an. Die Achse k=0 verfügt über Uk=4 Elemente und die Achse k=1 über Uk=8 Tupel. P ist die Gesamtzahl der Achsen in der Abfrage, hier gleich 2. S0, die anfängliche Summe ist i=0 bis 1. Für i=0 ist das Tupel ordinal auf Achse 0 von {Store Cost} 1. Für i = 1 ist die Tupelordinalzahl von {CA, Q3} 2.

Für i=0, Ei = 1, also für i = 0 ist die Summe 1 * 1 = 1 und für i = 1 ist die Summe 2 (Tupel ordinal) * 4 (der Wert von Ei, berechnet als 1 * 4), oder 8, und so ist die Summe gleich 1 + 8 = 9, der Zell ordinal für diese Zelle.

Die vollständige XML-Ausgabe für das obige Dataset wird in Anhang D angezeigt.

Befehl

Der Befehlsdatentyp ist ein XML-Dokumenttyp. In dieser Version der XML for Analysis-Spezifikation besteht der Befehlsdatentyp ausschließlich aus dem <Statement-Tag> des Typs Zeichenfolge, das den Text für die Befehlsanweisungen enthält. Das Statement-Element> mit einer MDX-Anweisung kann beispielsweise <wie folgt aussehen:

<Statement>
  SELECT Measures.MEMBERS on columns from Sales
</Statement>

In einer zukünftigen Version dieser Spezifikation wird das XML-Dokument für den Command-Datentyp über das in dieser Spezifikation definierte statement-Element <> hinaus erweitert.

Die XML for Analysis-Spezifikation erfordert, dass mehrdimensionale Anbieter die MdXML-Sprache unterstützen. Die MdXML-Sprache basiert auf MDX. mdXML besteht derzeit nur aus dem <Statement-Element> . Für mehrdimensionale Anbieter muss das <Statement-Element> eine MDX-Sprachanweisungen enthalten. Durch zukünftige Verbesserungen an mdXML werden zusätzliche Elemente über das <Statement-Element> hinaus verfügbar sein. Das <Statement-Element> unterstützt weiterhin eine vollständige MDX-Anweisung als Typzeichenfolge, auch wenn sie erweitert wird, um auch andere XML-Elemente zuzulassen.

Zusätzlich zu zukünftigen Verbesserungen von mdXML ist die MDX-Sprache selbst erweiterbar, sodass Anbieter der Sprache Erweiterungen hinzufügen können, um zusätzliche Features zu unterstützen, die nicht im Basissprachsatz bereitgestellt werden. Weitere Informationen zu mdXML finden Sie im Abschnitt Beziehung zwischen MDX und mdXML.

Eigenschaften

Der Datentyp Properties stellt eine Auflistung von XML-Eigenschaften für Analysis dar. Jede Eigenschaft wird durch ein XML-Element definiert, und der Wert der -Eigenschaft sind die Daten, die im XML-Element enthalten sind. Der Name des XML-Elements entspricht dem Namen der Eigenschaft.

Jeder Anbieter kann den Satz von Eigenschaften erweitern, aber anbieterspezifische Eigenschaftennamen müssen wohlgeformte XML-Tags sein.

Ein Beispiel folgt:

<PropertyList>
 <DataSourceInfo>
  Provider=MSOLAP;Data Source=local;
 </DataSourceInfo>
 <Catalog>
  Foodmart 2000
 </Catalog>
 <Format>
  Multidimensional
 </Format>
</PropertyList>

Beschränkungen

Der Datentyp Einschränkungen stellt eine Sammlung von Einschränkungen dar, die während der Ausführung einer Discover-Methode angewendet werden sollen. Der Einschränkungsname gibt den Namen der Rowsetspalte an, die eingeschränkt wird. Der Einschränkungswert definiert die Daten für die Spalte.

Jeder Anbieter kann neue Schemarowsets hinzufügen, aber Spalten, die eingeschränkt werden können, sollten Namen aufweisen, die die Wohlgeformtheitseinschränkungen von XML erfüllen.

Im folgenden Beispiel wird eine Einschränkung für einen Spaltennamen im MDSCHEMA_CUBES Schemarowsets gesendet:

<RestrictionList>
 <CATALOG_NAME>
  FoodMart 2000
 </CATALOG_NAME>
 ...
</RestrictionList>

Bei Bedarf kann eine Spalte mit mehreren Werten eingeschränkt werden. Jeder Wert wird in einem <Value-Element> dargestellt. Ein Beispiel folgt:

<RestrictionList>
 <LiteralName>
  <Value>DBLITERAL_QUOTE_PREFIX</Value>
  <Value>DBLITERAL_QUOTE_SUFFIX</Value>
  <Value>DBLITERAL_ESCAPE_UNDERSCORE_PREFIX</Value>
  <Value>DBLITERAL_ESCAPE_UNDERSCORE_SUFFIX</Value>
 </LiteralName>
 ...
</RestrictionList>

Resultset

Der Resultset-Datentyp ist ein selbstbeschreibende XML-Resultset. Der Typ der darin enthaltenen Daten wird durch die XML for Analysis Format-Eigenschaft angegeben.

Standardmäßig wird das XML-Schema mit dem Resultset zurückgegeben. Dies kann mithilfe der Content-Eigenschaft geändert werden, die unter XML for Analysis Properties beschrieben wird.

Rowset

Das xml-Schema, das in das Rowset eingebettet ist, definiert die spezifische Struktur des Rowset-Rückgabedatentyps. Die allgemeine Struktur des XML for Analysis-Rowsets ähnelt dem Microsoft® SQL Server ™ 2000-Rowsetformat, das mit der FOR XML RAW-Klausel abgerufen wurde, ist aber eher element- als attributzentriert und ermöglicht hierarchische Daten.

XML lässt bestimmte Zeichen nicht als Element- und Attributnamen zu. XML for Analysis unterstützt die von SQL Server 2000 definierte Codierung, um diese XML-Einschränkung zu beheben. Für Spaltennamen, die ungültige XML-Namenszeichen (gemäß xml 1.0-Spezifikation) enthalten, werden die nicht gültigen Unicode-Zeichen mit den entsprechenden Hexadezimalwerten codiert. Diese werden als _xHHHH_ mit Escapezeichen versehen, wobei HHHH für den vierstelligen hexadezimalen UCS-2-Code für das Zeichen in der ersten Reihenfolge der wichtigsten Bits steht. Beispielsweise ist der Name "Bestelldetails" als Order*_x0020_*Details codiert, wobei das Leerzeichen durch den entsprechenden Hexadezimalcode ersetzt wird.

Die Codierung kann XSL-Transformationen (Extensible Style Language) erschweren. Um eine schnelle Suche der tatsächlichen nicht codierten Spaltennamen zu unterstützen, fügen Sie das sql:field-Attribut dem XML-Rowsetschema mit jeder Spalte hinzu. Dieses Attribut befindet sich im Namespace "urn:schemas-microsoft-com:xml-sql".

Ein Beispiel folgt:

<xsd:element name="Order_x0020_Details" type="string" sql:field="Order Details" /> 

Für flache Daten wird das Rowsetformat XML for Analysis wie im folgenden Beispiel angezeigt. Die Spaltennamen, die für die Abfrage spezifisch sind, werden im Schema als Elementnamen definiert. Ein Paar von <Zeilentags> kapselt jede Zeile:

<root xmlns="urn:schemas-microsoft-com:xml-analysis:rowset"
 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:xml-sql">
   </xsd:element>
      <xsd:complexType name="row">
         <xsd:choice maxOccurs="unbounded" minOccurs="0">
            <xsd:element name="CATALOG_NAME" type="xsd:string" sql:field="CATALOG_NAME"></xsd:element>
            <xsd:element name="DESCRIPTION" type="xsd:string" sql:field="DESCRIPTION"></xsd:element>
            <xsd:element name="ROLES" type="xsd:string" sql:field="ROLES"></xsd:element>
            <xsd:element name="DATE_MODIFIED" type="xsd:time" sql:field="DATE_MODIFIED"></xsd:element>
         </xsd:choice>
      </xsd:complexType>
   </xsd:schema>
   <row>
      <CATALOG_NAME>FoodMart 2000</CATALOG_NAME>
      <DESCRIPTION></DESCRIPTION>
      <ROLES>All Users</ROLES>
      <DATE_MODIFIED>3/11/2001 6:49:36 PM</DATE_MODIFIED>
   </row>
   …
</Root>

Für hierarchische Daten (oder geschachtelte Rowsets), z. B. die von OLE DB für Data Mining-Abfragen zurückgegeben werden, wird das Rowsetformat XML for Analysis wie im folgenden Beispiel angezeigt. Die Struktur der Zeilen wird nicht geändert, aber das datenspezifische Schema definiert einen Elementuntertyp, der die geschachtelten Daten enthält. In diesem Fall ist <NODE_DISTRIBUTION>das geschachtelte Element .

<root xmlns="urn:schemas-microsoft-com:xml-analysis:rowset">
 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <xsd:complexType name="row">
         <xsd:choice maxOccurs="unbounded" minOccurs="0">
            <xsd:sequence maxOccurs="unbounded" minOccurs="0">
               <xsd:element name="NODE_DISTRIBUTION"
                sql:field="NODE_DISTRIBUTION">
                  <xsd:complexType>
                     <xsd:choice maxOccurs="unbounded" minOccurs="0">
                        <xsd:element name="ATTRIBUTE_NAME"
                         type="xsd:string"
                         sql:field="ATTRIBUTE_NAME"></xsd:element>
                           <xsd:element name="ATTRIBUTE_VALUE"
                            type="xsd:string"
                            sql:field="ATTRIBUTE_VALUE"></xsd:element>
                           <xsd:element name="SUPPORT" type="xsd:double"
                            sql:field="SUPPORT"></xsd:element>
                        <xsd:element name="PROBABILITY" type="xsd:double"
                         sql:field="PROBABILITY"></xsd:element>
                        <xsd:element name="VARIANCE" type="xsd:double"
                         sql:field="VARIANCE"></xsd:element>
                        <xsd:element name="VALUETYPE" type="xsd:int"
                         sql:field="VALUETYPE"></xsd:element>
                     </xsd:choice>
                  </xsd:complexType>
               </xsd:element>
            </xsd:sequence>
            <xsd:element name="MODEL_CATALOG" type="xsd:string"
             sql:field="MODEL_CATALOG"></xsd:element>
            <xsd:element name="MODEL_SCHEMA" type="xsd:string"
             sql:field="MODEL_SCHEMA"></xsd:element>
            <xsd:element name="MODEL_NAME" type="xsd:string"
             sql:field="MODEL_NAME"></xsd:element>
            <xsd:element name="ATTRIBUTE_NAME" type="xsd:string"
             sql:field="ATTRIBUTE_NAME"></xsd:element>
            <xsd:element name="NODE_NAME" type="xsd:string"
             sql:field="NODE_NAME"></xsd:element>
            <xsd:element name="NODE_UNIQUE_NAME" type="xsd:string"
             sql:field="NODE_UNIQUE_NAME"></xsd:element>
            <xsd:element name="NODE_TYPE" type="xsd:unsignedInt"
             sql:field="NODE_TYPE"></xsd:element>
            <xsd:element name="NODE_GUID" type="xsd:string"
             sql:field="NODE_GUID"></xsd:element>
            <xsd:element name="NODE_CAPTION" type="xsd:string"
             sql:field="NODE_CAPTION"></xsd:element>
            <xsd:element name="CHILDREN_CARDINALITY"
             type="xsd:unsignedInt"
             sql:field="CHILDREN_CARDINALITY"></xsd:element>
            <xsd:element name="PARENT_UNIQUE_NAME" type="xsd:string"
             sql:field="PARENT_UNIQUE_NAME"></xsd:element>
            <xsd:element name="NODE_DESCRIPTION" type="xsd:string"
             sql:field="NODE_DESCRIPTION"></xsd:element>
            <xsd:element name="NODE_RULE" type="xsd:string"
             sql:field="NODE_RULE"></xsd:element>
            <xsd:element name="MARGINAL_RULE" type="xsd:string"
             sql:field="MARGINAL_RULE"></xsd:element>
            <xsd:element name="NODE_PROBABILITY" type="xsd:double"
             sql:field="NODE_PROBABILITY"></xsd:element>
            <xsd:element name="MARGINAL_PROBABILITY" type="xsd:double"
             sql:field="MARGINAL_PROBABILITY"></xsd:element>
            <xsd:element name="NODE_SUPPORT" sql:type="xsd:double"
             sql:field="NODE_SUPPORT"></xsd:element>
            <xsd:element name="MSOLAP_MODEL_COLUMN" sql:type="xsd:string"
             sql:field="MSOLAP_MODEL_COLUMN"></xsd:element>
            <xsd:element name="MSOLAP_NODE_SCORE" sql:type="xsd:double"
             sql:field="MSOLAP_NODE_SCORE"></xsd:element>
            <xsd:element name="MSOLAP_NODE_SHORT_CAPTION"
             sql:type="xsd:string"
             sql:field="MSOLAP_NODE_SHORT_CAPTION"></xsd:element>
         </xsd:choice>
      </xsd:complexType>
   </xsd:schema>
   <row>
      <MODEL_CATALOG>FoodMart 2000</MODEL_CATALOG>
      <MODEL_NAME>customer pattern discovery</MODEL_NAME>
      <ATTRIBUTE_NAME>Customers.Name.Member Card</ATTRIBUTE_NAME>
      <NODE_NAME>2147483652</NODE_NAME>
      <NODE_UNIQUE_NAME>2147483652</NODE_UNIQUE_NAME>
      <NODE_TYPE>2</NODE_TYPE>
      <NODE_CAPTION>All</NODE_CAPTION>
      <CHILDREN_CARDINALITY>8</CHILDREN_CARDINALITY>
      <PARENT_UNIQUE_NAME>0</PARENT_UNIQUE_NAME>
      <NODE_DESCRIPTION>All</NODE_DESCRIPTION>
      <NODE_RULE></NODE_RULE>
      <MARGINAL_RULE></MARGINAL_RULE>
      <NODE_PROBABILITY>1</NODE_PROBABILITY>
      <MARGINAL_PROBABILITY>1</MARGINAL_PROBABILITY>
      <NODE_DISTRIBUTION>
         <ATTRIBUTE_NAME>Customers.Name.Member Card</ATTRIBUTE_NAME>
         <ATTRIBUTE_VALUE>missing</ATTRIBUTE_VALUE>
         <SUPPORT>0</SUPPORT>
         <PROBABILITY>0</PROBABILITY>
         <VARIANCE>0</VARIANCE>
         <VALUETYPE>1</VALUETYPE></NODE_DISTRIBUTION>
      <NODE_DISTRIBUTION>
         <ATTRIBUTE_NAME>Customers.Name.Member 
Card</ATTRIBUTE_NAME>
         <ATTRIBUTE_VALUE>Bronze</ATTRIBUTE_VALUE>
         <SUPPORT>3077</SUPPORT>
         <PROBABILITY>0.551334886221107</PROBABILITY>
         <VARIANCE>0</VARIANCE>
         <VALUETYPE>4</VALUETYPE></NODE_DISTRIBUTION>
      <NODE_DISTRIBUTION>
         <ATTRIBUTE_NAME>Customers.Name.Member Card</ATTRIBUTE_NAME>
         <ATTRIBUTE_VALUE>Golden</ATTRIBUTE_VALUE>
         <SUPPORT>659</SUPPORT>
         <PROBABILITY>0.118079197276474</PROBABILITY>
         <VARIANCE>0</VARIANCE>
         <VALUETYPE>4</VALUETYPE></NODE_DISTRIBUTION>
      <NODE_DISTRIBUTION>
         <ATTRIBUTE_NAME>Customers.Name.Member Card</ATTRIBUTE_NAME>
         <ATTRIBUTE_VALUE>Normal</ATTRIBUTE_VALUE>
         <SUPPORT>1332</SUPPORT>
         <PROBABILITY>0.238666905572478</PROBABILITY>
         <VARIANCE>0</VARIANCE>
         <VALUETYPE>4</VALUETYPE></NODE_DISTRIBUTION>
      <NODE_DISTRIBUTION>
         <ATTRIBUTE_NAME>Customers.Name.Member Card</ATTRIBUTE_NAME>
         <ATTRIBUTE_VALUE>Silver</ATTRIBUTE_VALUE>
         <SUPPORT>513</SUPPORT>
         <PROBABILITY>9.19190109299409E-02</PROBABILITY>
         <VARIANCE>0</VARIANCE>
         <VALUETYPE>4</VALUETYPE></NODE_DISTRIBUTION>
      <NODE_SUPPORT>5581</NODE_SUPPORT>
      <MSOLAP_MODEL_COLUMN>Customers.Name.Member 
Card</MSOLAP_MODEL_COLUMN>
      <MSOLAP_NODE_SCORE>1948.401692055</MSOLAP_NODE_SCORE>
      <MSOLAP_NODE_SHORT_CAPTION>All</MSOLAP_NODE_SHORT_CAPTION>
</row>
</root>

Zeichenfolge

Der String-Typ entspricht dem standardmäßigen XML-Zeichenfolgendatentyp.

UnsignedInt

Der UnsignedInt-Datentyp entspricht dem XML-Schematyp unsignedInt.

XML für Analyserowsets

Die im Result-Parameter der Discover-Methode zurückgegebenen Informationen werden entsprechend den in diesem Abschnitt beschriebenen Rowsetspaltenlayouts strukturiert.

Alle Spalten, die in den folgenden Rowsets notiert sind, sind erforderlich und müssen in der angezeigten Reihenfolge zurückgegeben werden. Allerdings können zusätzliche Spalten (die von Clients ignoriert werden sollten, die sie nicht erwarten) am Ende hinzugefügt werden, und einige Spalten können NULL-Daten für Informationen enthalten, die nicht gelten.

In den folgenden Abschnitten werden die Spalten in den einzelnen Rowsets beschrieben. Jeder Abschnitt enthält eine Tabelle, die die folgenden Informationen für jede Spalte enthält.

Spaltenüberschrift Inhalte
Spaltenname Der Name der Spalte im Ausgaberowset.
Typ Eine Beschreibung des Datentyps für die Spalte. Weitere Informationen zu Datentypen, die von XML für die Analyse unterstützt werden, finden Sie unter Datentypen, die in XML für die Analyse verwendet werden.
BESCHREIBUNG Eine kurze Beschreibung des Zwecks der Spalte.
Einschränkung Gibt an, ob die Spalte verwendet werden kann, um das zurückgegebene Rowset durch Aufnahme in den Parameter Restrictions der Discover-Methode einzuschränken. Ja bedeutet, dass die Spalte als Einschränkungselement zum Filtern von Ergebnissen nach diesem Feld verfügbar ist.
Nullwerte zulässig Gibt an, ob die Daten zurückgegeben werden müssen oder ob eine NULL-Zeichenfolge zulässig ist, wenn die Spalte nicht zutrifft. Ja bedeutet, dass NULL-Werte zulässig sind und die Daten optional sind. Nein bedeutet, dass die Daten erforderlich sind.

DISCOVER_DATASOURCES-Rowset

Wenn die Discover-Methode mit dem DISCOVER_DATASOURCES Enumerationswert im RequestType-Parameter aufgerufen wird, gibt sie das DISCOVER_DATASOURCES Rowset im Parameter Result zurück. Dieser Anforderungstyp gibt eine Liste veröffentlichter Datenquellen (auf implementierungsspezifische Weise) aus einer URL des Anwendungswebservers zurück, sodass der Client eine auswählen kann, mit der eine Verbindung hergestellt werden soll.

Spaltenname type BESCHREIBUNG Einschränkung Nullwerte zulässig
DataSourceName Zeichenfolge Der Name der Datenquelle, z. B. FoodMart 2000. Ja Nein
DataSourceDescription Zeichenfolge Eine Beschreibung der Datenquelle, wie sie vom Herausgeber eingegeben wurde. Nein Ja
URL Zeichenfolge Der eindeutige Pfad, der zeigt, wo die XML for Analysis-Methoden für diese Datenquelle aufgerufen werden. Ja Ja
DataSourceInfo Zeichenfolge Eine Zeichenfolge, die alle zusätzlichen Informationen enthält, die zum Herstellen einer Verbindung mit der Datenquelle erforderlich sind. Dies kann die Initial Catalog-Eigenschaft oder andere Informationen für den Anbieter umfassen.

Beispiel: "Provider=MSOLAP;Data Source=Local;"

Nein Ja
ProviderName Zeichenfolge Der Name des Anbieters hinter der Datenquelle.

Beispiel: "MSDASQL"

Ja Ja
Spaltenname
(Fortsetzung)
Typ
(Fortsetzung)
BESCHREIBUNG
(Fortsetzung)
Einschränkung
(Fortsetzung)
Nullwerte zulässig
(Fortsetzung)
ProviderType array Die vom Anbieter unterstützten Datentypen. Kann einen oder mehrere der folgenden Typen enthalten. Das Beispiel folgt auf diese Tabelle.
  • TDP: Tabellendatenanbieter.
  • MDP: mehrdimensionaler Datenanbieter.
  • DMP: Data Mining-Anbieter. Ein DMP-Anbieter implementiert die OLE DB für Data Mining-Spezifikation.
Ja Nein
Spaltenname
(Fortsetzung)
Typ
(Fortsetzung)
BESCHREIBUNG
(Fortsetzung)
Einschränkung
(Fortsetzung)
Nullwerte zulässig
(Fortsetzung)
AuthenticationMode EnumString Gibt an, welchen Sicherheitsmodus die Datenquelle verwendet. Folgende Werte sind möglich:
  • Nicht authentifiziert: Es muss keine Benutzer-ID oder kein Kennwort gesendet werden.
  • Authentifiziert: Benutzer-ID und Kennwort müssen in den für die Verbindung erforderlichen Informationen enthalten sein.
  • Integriert: Die Datenquelle verwendet die zugrunde liegende Sicherheit, um die Autorisierung zu bestimmen, z. B. integrierte Sicherheit, die von Microsoft-Internetinformationsdienste (IIS) bereitgestellt wird.
Ja Nein

Das ProviderType-Array verfügt über ein Element für jeden Typ, den der Anbieter unterstützt. Für instance erstellt ein Anbieter, der TDP, MDP und DMP unterstützt, das folgende Array:

<ProviderType><MDP/><TDP/><DMP/></ProviderType>

DISCOVER_PROPERTIES-Rowset

Wenn die Discover-Methode mit dem DISCOVER_PROPERTIES Enumerationswert im Parameter RequestType aufgerufen wird, gibt sie das DISCOVER_PROPERTIES Rowset im Result-Parameter zurück. Dieser Anforderungstyp gibt Informationen zu den standard- und anbieterspezifischen Eigenschaften zurück, die von einem XML-Analyseanbieter unterstützt werden. Eigenschaften, die von einem Anbieter nicht unterstützt werden, werden nicht im Rückgabeergebnissatz aufgeführt.

Spaltenname type BESCHREIBUNG Einschränkung Nullwerte zulässig
PropertyName Zeichenfolge Den Namen der Eigenschaft. Ja, als Array Nein
PropertyDescription Zeichenfolge Eine lokalisierbare Textbeschreibung der Eigenschaft. Nein Ja
PropertyType Zeichenfolge Der XML-Datentyp der Eigenschaft. Nein Ja
PropertyAccessType EnumString Zugriff für die Eigenschaft. Der Wert kann Read, Writeoder ReadWritelauten. Nein Nein
IsRequired boolean True, wenn eine Eigenschaft erforderlich ist, false, wenn sie nicht erforderlich ist. Nein Ja
Wert Zeichenfolge Der aktuelle Wert der Eigenschaft. Nein Ja

DISCOVER_SCHEMA_ROWSETS-Rowsets

Wenn die Discover-Methode mit dem DISCOVER_SCHEMA_ROWSETS Enumerationswert im RequestType-Parameter aufgerufen wird, gibt sie das DISCOVER_SCHEMA_ROWSETS Rowset im Result-Parameter zurück. Dieser Anforderungstyp ruft eine Liste aller RequestTypes-Enumerationswerte ab, die vom Anbieter unterstützt werden.

Spaltenname type BESCHREIBUNG Einschränkung Nullwerte zulässig
Schemaname Zeichenfolge Der Name des Schemas/der Anforderung. Dadurch werden die Werte in der RequestTypes-Enumeration sowie alle zusätzlichen Typen zurückgegeben, die vom Anbieter unterstützt werden. Der Anbieter definiert Rowsetstrukturen für die zusätzlichen Typen. Ja Nein
Einschränkungen array Ein Array der vom Anbieter unterstützten Einschränkungen. Ein Beispiel folgt auf diese Tabelle. Nein Ja
Beschreibung string Eine lokalisierbare Beschreibung des Schemas. Nein Ja

Das im Einschränkungsarray zurückgegebene Ergebnis könnte wie folgt für einen Anbieter aussehen, der drei Einschränkungen für das DBSCHEMA_MEMBERS Schemarowset unterstützt hat. Die Elemente verweisen auf Spaltennamen im Schema.

  <Restrictions>
    <RestrictionList>
      <CATALOG_NAME type="string" /> 
      <SCHEMA_NAME type="string" /> 
      <CUBE_NAME type="string" /> 
    </RestrictionList>
  </Restrictions>

Die folgende Tabelle gibt an, welche OLE DB-Schemarowsets für xml for Analysis tabellarische Datenanbieter und mehrdimensionale Datenanbieter erforderlich sind. In einigen Fällen sind einige Spalten innerhalb der Schemarowsets, die für OLE DB für OLAP-Anbieter erforderlich sind, für XML for Analysis-Anbieter optional. Diese Schemarowsets werden in der folgenden Tabelle mit einem Sternchen (*) angegeben. Die Details der optionalen Spalten werden in dieser Tabelle aufgeführt.

OLE DB-Schemarowset Erforderlich für BESCHREIBUNG
DBSCHEMA_CATALOGS TDP, MDP, DMP Kataloge, die für einen Server instance des Anbieters verfügbar sind
DBSCHEMA_COLUMNS TDP, DMP Enumeration der Spalten von Tabellen
DBSCHEMA_PROVIDER_TYPES TDP, DMP Enumeration der vom Anbieter unterstützten Basisdatentypen
DBSCHEMA_TABLES TDP, DMP Aufzählung von Tabellen im Katalog
DBSCHEMA_TABLES_INFO TDP, DMP Aufzählung von Tabellen im Katalog
MDSCHEMA_ACTIONS MDP Enumeration der verfügbaren Aktionen
MDSCHEMA_CUBES MDP Enumeration von Cubes im Katalog
MDSCHEMA_DIMENSIONS MDP Enumeration von Dimensionen für alle Cubes
MDSCHEMA_FUNCTIONS* MDP Enumeration von MDX-Funktionen, die vom Anbieter unterstützt werden
MDSCHEMA_HIERARCHIES* MDP Enumeration von Hierarchien in allen Dimensionen
MDSCHEMA_MEASURES MDP Enumeration von Measures in allen Cubes
MDSCHEMA_MEMBERS* MDP Enumeration aller Member in allen Dimensionen aller Cubes
MDSCHEMA_PROPERTIES* MDP Enumeration von benutzerdefinierten Eigenschaften, die für Zellen und Elemente verfügbar sind
MDSCHEMA_SETS MDP Enumeration der verfügbaren Mengen in einem Katalog.

Die schemarowsets, die in der obigen Tabelle mit einem Sternchen (*) gekennzeichnet sind, enthalten Spalten, die zwar für OLE DB für OLAP-Anbieter erforderlich sind, aber für XML for Analysis-Anbieter als optional gelten. Diese optionalen Spalten sind in der folgenden Tabelle aufgeführt.

OLE DB-Schemarowset OLE DB erforderte Spalten, die optional für
XML für Analyseanbieter
MDSCHEMA_FUNCTIONS URSPRUNG, INTERFACE_NAME
MDSCHEMA_HIERARCHIES STRUCTURE
MDSCHEMA_MEMBERS LEVEL_UNIQUE_NAME, LEVEL_NUMBER, PARENT_LEVEL
MDSCHEMA_PROPERTIES LEVEL_UNIQUE_NAME

Das OLE DB für OLAP-MDSCHEMA_LEVELS Schemarowset ist für XML for Analysis-MDP-Anbieter nicht erforderlich, obwohl Anbieter optional auswählen, dass es unterstützt wird. Daher sind Spalten, die auf Ebenen in anderen Schemarowsets verweisen, wie oben beschrieben ebenfalls optional geworden. Dies liegt daran, dass verschiedene mehrdimensionale Anbieter den Begriff ebene mit unterschiedlichen Bedeutungen verwenden (einige Anbieter nummerieren sie von oben nach unten und andere von unten nach oben). Es ist vorgesehen, dass zusätzliche Schemarowsets für Ebenen in einer zukünftigen Version dieser Spezifikation hinzugefügt werden.

DISCOVER_ENUMERATORS-Rowset

Wenn die Discover-Methode mit dem DISCOVER_ENUMERATORS Enumerationswert im RequestType-Parameter aufgerufen wird, gibt sie das DISCOVER_ENUMERATORS Rowset im Result-Parameter zurück. Dieser Anforderungstyp fragt einen Anbieter nach unterstützten Enumeratoren ab, einschließlich Datentypen und Werten. Durch Die Unterstützung dieser Anforderung veröffentlicht ein Anbieter alle Enumerationskonstanten, die er erkennt.

Für jeden Enumerator gibt es mehrere Elemente, eines für jeden Wert in der Enumeration. Das Rowset, das dies darstellt, ist flach, und der Name des Enumerators kann für Elemente wiederholt werden, die zu derselben Enumeration gehören.

Spaltenname type BESCHREIBUNG Einschränkung Nullwerte zulässig
EnumName Zeichenfolge Der Name des Enumerators, der eine Wertemenge enthält. Ja, als Array Nein
EnumDescription Zeichenfolge Eine lokalisierbare Beschreibung des Enumerators. Nein Ja
Enumtype Zeichenfolge Der Datentyp der Enumerationswerte. Nein Nein
ElementName Zeichenfolge Der Name eines der Wertelemente im Enumeratorsatz.

Beispiel: TDP

Nein Nein
ElementBeschreibung Zeichenfolge Eine lokalisierbare Beschreibung des Elements (optional). Nein Ja
ElementValue Zeichenfolge Der Wert des Elements.

Beispiel: 01

Nein Ja

DISCOVER_KEYWORDS Rowset

Wenn die Discover-Methode mit dem DISCOVER_KEYWORDS-Enumerationswert im RequestType-Parameter aufgerufen wird, gibt sie das DISCOVER_KEYWORDS Rowset im Result-Parameter zurück. Dieser Anforderungstyp listet Schlüsselwörter auf, die von einem Anbieter reserviert sind.

Jede zurückgegebene Schlüsselwort (keyword) ist eine Zeile im DISCOVER_KEYWORDS Rowset.

Spaltenname type BESCHREIBUNG Einschränkung Nullwerte zulässig
Schlüsselwort Zeichenfolge Eine Liste aller von einem Anbieter reservierten Schlüsselwörter.

Beispiel: AND

Ja, als Array Nein

DISCOVER_LITERALS-Rowset

Wenn die Discover-Methode mit dem DISCOVER_LITERALS Enumerationswert im RequestType-Parameter aufgerufen wird, wird das DISCOVER_LITERALS-Rowsets im Result-Parameter zurückgegeben. Dieser Anforderungstyp fragt einen Anbieter nach Informationen zu unterstützten Literalen ab, einschließlich Datentypen und Werten.

Jedes zurückgegebene Literal ist eine Zeile im DISCOVER_LITERALS Rowsets.

Spaltenname type BESCHREIBUNG Einschränkung Nullwerte zulässig
LiteralName Zeichenfolge Der Name des in der Zeile beschriebenen Literals.

Beispiel: DBLITERAL_LIKE_PERCENT

Ja, als Array Nein
LiteralValue Zeichenfolge Enthält den tatsächlichen Literalwert.

Beispiel: Wenn LiteralName DBLITERAL_LIKE_PERCENT ist und das Prozentzeichen (%) verwendet wird, um mit null oder mehr Zeichen in einer LIKE-Klausel zu übereinstimmen, lautet der Wert dieser Spalte "%".

Nein Nein
LiteralInvalidChars Zeichenfolge Die Zeichen im Literal, die ungültig sind.

Wenn Tabellennamen beispielsweise etwas anderes als ein numerisches Zeichen enthalten können, lautet diese Zeichenfolge "0123456789".

Nein Ja
LiteralInvalidStartingChars Zeichenfolge Die Zeichen, die nicht als erstes Zeichen des Literals verwendet werden dürfen. Wenn das Literal mit irgendeinem gültigen Zeichen beginnen kann, ist dies null. Nein Ja
LiteralMaxLength integer Es können maximal 250 Zeichen eingegeben werden. Wenn die Spalte über keine maximale Länge verfügt, ist der Wert -1 (Standardwert). Nein Ja

XML für Analyseeigenschaften

In diesem Abschnitt werden die eigenschaften beschrieben, die für XML for Analysis erforderlich sind.

Column Inhalte
Name Der Name der Eigenschaft.
Typ Der Datentyp der Eigenschaft. Weitere Informationen zu datentypen, die in dieser Spezifikation verwendet werden, finden Sie unter Datentypen, die in XML für die Analyse verwendet werden.
R/W Das Lese-/Schreibverhalten der Eigenschaft.
Standardwert Der Standardwert der Eigenschaft.
Verwendung Die -Methode (und ggf. RequestType) oder die Methoden, in denen die -Eigenschaft verwendet werden kann.
BESCHREIBUNG Eine grundlegende Beschreibung des Verhaltens der Eigenschaft.

Die folgende Tabelle enthält spezifische Informationen für jede Eigenschaft.

Name Typ R/W Standardwert Verwendung BESCHREIBUNG
AxisFormat Enumeration W   Execute-Methode Der Client fordert die MDDataSet-Achse auf eine der folgenden Arten an: TupleFormat, ClusterFormat, CustomFormat.
BeginRange * INT W -1 Execute-Methode Ein ganzzahliger Wert, der einem CellOrdinal entspricht, der verwendet wird, um ein von einem Befehl zurückgegebenes MDDataSet auf einen bestimmten Zellbereich zu beschränken. Wird in Verbindung mit der EndRange-Eigenschaft verwendet. Wenn keine Angabe erfolgt, werden alle Zellen im Rowset zurückgegeben. Der Wert -1 bedeutet nicht angegeben.
Name
(Fortsetzung)
Typ
(Fortsetzung)
R/W Standardwert
(Fortsetzung)
Verwendung
(Fortsetzung)
BESCHREIBUNG
(Fortsetzung)
Katalog Zeichenfolge R/W leere Zeichenfolge Discover-Methode

Execute-Methode

Gibt den anfänglichen Katalog oder die anfängliche Datenbank an, mit der bzw. der eine Verbindung hergestellt werden soll.
Inhalt EnumString W SchemaData Discover-Methode

Execute-Methode

Ein Enumerator, der angibt, welcher Datentyp im Resultset zurückgegeben wird.

Keine: Ermöglicht es, die Struktur des Befehls zu überprüfen, aber nicht auszuführen. Analog zur Verwendung von Prepare zum Überprüfen der Syntax usw.

Schema: Enthält das XML-Schema (das Spalteninformationen usw. angibt), das sich auf die angeforderte Abfrage bezieht.

Daten: Enthält nur die angeforderten Daten.

SchemaData: Gibt sowohl die Schemainformationen als auch die Daten zurück.

DataSourceInfo Zeichenfolge R/W leere Zeichenfolge Discover-Methode

Execute-Methode

Eine Zeichenfolge mit anbieterspezifischen Informationen, die für den Zugriff auf die Datenquelle erforderlich ist.
Name
(Fortsetzung)
Typ
(Fortsetzung)
R/W Standardwert
(Fortsetzung)
Verwendung
(Fortsetzung)
BESCHREIBUNG
(Fortsetzung)
EndRange * INT W -1 Execute-Methode Ein ganzzahliger Wert, der einem CellOrdinal entspricht, der verwendet wird, um ein von einem Befehl zurückgegebenes MDDataSet auf einen bestimmten Zellbereich einzuschränken. Wird in Verbindung mit der BeginRange-Eigenschaft verwendet. Wenn keine Angabe erfolgt, werden alle Zellen im Rowset zurückgegeben. Der Wert -1 bedeutet nicht angegeben.
Format EnumString W Tabellarisch für discover-Methode; Mehrdimensional für Execute-Methode Discover-Methode

Execute-Methode

Enumerator, der das Format des zurückgegebenen Resultsets bestimmt. Mögliche Werte:
  • Tabellarisch: ein flaches oder hierarchisches Rowset. Ähnlich dem XML RAW-Format in SQL. Die Format-Eigenschaft sollte für OLE DB für Data Mining-Befehle auf Tabellarisch festgelegt werden.
  • Mehrdimensional: Gibt an, dass das Resultset das MDDataSet-Format verwendet (nur Execute-Methode ).
Name
(Fortsetzung)
Typ
(Fortsetzung)
R/W Standardwert
(Fortsetzung)
Verwendung
(Fortsetzung)
BESCHREIBUNG
(Fortsetzung)
LocaleIdentifier unsignedInt R/W Keine Discover-Methode

Execute-Methode

Verwenden Sie diese Option, um den numerischen Gebietsschemabezeichner für diese Anforderung zu lesen oder festzulegen. Der Standardwert ist anbieterspezifisch.

Die vollständige hexadezimale Liste der Sprachbezeichner finden Sie unter "Sprachbezeichner" in der MSDN® Library http://www.msdn.microsoft.com.

MDXSupport EnumString R Core Discover-Methode Enumeration, die den Grad der MDX-Unterstützung beschreibt. Bei der ersten Version ist Core der einzige Wert in der Enumeration. In zukünftigen Versionen werden andere Werte für diese Enumeration definiert.
Kennwort Zeichenfolge W leere Zeichenfolge Discover-Methode

Execute-Methode

Eine Zeichenfolge, die der Client alle Kennwortinformationen bereitstellen kann, die für die Verbindung erforderlich sind.
ProviderName Zeichenfolge R leere Zeichenfolge Discover-Methode Der NAME des XML-Analyseanbieters.
ProviderVersion Zeichenfolge R leere Zeichenfolge Discover-Methode Die Versionsnummer des XML for Analysis Provider (Implementierung). Der Versionswert sollte ein vierteiliges Format sein, wobei jedes Teil durch eine Dezimalzahl getrennt ist.
Name
(Fortsetzung)
Typ
(Fortsetzung)
R/W Standardwert
(Fortsetzung)
Verwendung
(Fortsetzung)
BESCHREIBUNG
(Fortsetzung)
StateSupport EnumString R Keine Discover-Methode Eigenschaft, die den Grad der Unterstützung im Anbieter für den Zustand angibt. Informationen zum Zustand in XML for Analysis finden Sie unter Unterstützung der Zustandserreichung in XML for Analysis. Die mindesten Enumerationswerte sind wie folgt:

Keine : Keine Unterstützung für Sitzungen oder zustandsbehaftete Vorgänge.

Sitzungen: Der Anbieter unterstützt Sitzungen.

Timeout UnsignedInt R/W Nicht definiert Discover-Methode

Execute-Methode

Ein numerisches Timeout, das in Sekunden angibt, wie lange auf eine erfolgreiche Verbindung gewartet werden muss.
UserName Zeichenfolge R/W leere Zeichenfolge Discover-Methode

Execute-Methode

Eine Zeichenfolge, die den für die Verbindung erforderlichen Benutzernamen enthält.

* Die Bereichswerte für Zellkoordinaten beginnen bei 0 (null). –1 bedeutet nicht definiert oder alle in einem Bereich.

Die folgende Tabelle enthält Beispiele für Bereichswertpaare und deren Verhalten. Im Allgemeinen muss Folgendes wahr sein, um ein Resultset "BeginRange <= EndRange" zurückzugeben. Bei BeginRange > EndRange ist der Bereich ungültig, und es werden keine Ergebnisse zurückgegeben.

BeginRange EndRange Verhalten
-1 -1 Alle Zellen oder Zeilen. Dies ist das Standardverhalten.
0 -1 Alle Zellen oder Zeilen, die von der ersten oder 0-ten bis zur undefinierten oder alle auf der Endseite reichen.
15 -1 Gibt Zelle 15 bis zum Ende des Datasets zurück.
-1 0 Die erste Zelle als erstes Element im Bereich ist nicht definiert (oder alle), und das endende Element ist das 0-te Element.
15 50 Gibt den Bereich der OLAP-Zellen 15 bis einschließlich 50 zurück. BeginRange <= EndRange.
2 1 Es werden keine Zellen zurückgegeben, da der Bereich ungültig ist (der Anfangswert ist größer als der Endwert). BeginRange > EndRange.

Fehlerbehandlung in XML für die Analyse

Fehler werden je nach Typ unterschiedlich behandelt. Die folgenden Arten von Fehlern können auftreten:

  • Fehler beim Ausführen eines Methodenaufrufs
  • Erfolgreich beim Ausführen eines Methodenaufrufs, jedoch mit Fehlern oder Warnungen
  • Erfolgreich beim Ausführen eines Methodenaufrufs, aber Fehler im Resultset

Ein Fehler beim Ausführen eines Methodenaufrufs wird über eine SOAP-Fehlermeldung gemeldet. Wenn dies der Fall ist, wird das Ergebnis nicht zurückgegeben. Wenn die Methode mit Fehlern oder Warnungen abgeschlossen ist, werden diese mit Result an den Client zurückgegeben.

MDDataSet-Fehlerbeispiel

Fehler, die für Zellen oder Daten in Result spezifisch sind, werden im Resultset an der entsprechenden Position eingebettet. Der MDDataSet-Datentyp wird in "MDDataSet" unter Datentypen, die in XML für die Analyse verwendet werden, behandelt. Es folgt ein Beispiel für das Ergebnis, wenn ein Fehler in einem MDDataSet vorliegt:

<CellData>
 ...
 <Cell CellOrdinal="10">
  <Value>
   <Error>
    <ErrorCode>2148497527</ErrorCode> 
    <Description>Security Error.</Description> 
   </Error>
  </Value>
  </Cell>
</CellData>

SOAP-Fehlerfehlerbeispiel

Die SOAP-Fehlercodes für diese Spezifikation beginnen mit "XMLForAnalysis", gefolgt von einem Punkt und dem hexadezimalen HR-Ergebniscode. Beispielsweise wird ein Fehlercode von "0x80000005" als "XMLForAnalysis.0x80000005" formatiert.

Weitere Informationen zum SOAP-Fehlerformat finden Sie unter http://www.w3.org/TR/SOAP/#_Ref477795996.

Die folgende Tabelle zeigt die XML for Analysis-Fehlercodeinformationen, die im Detailabschnitt der SOAP-Antwort enthalten sind. Die Spalten sind die Attribute eines Fehlers im Detailabschnitt eines SOAP-Fehlers.

Spaltenname type BESCHREIBUNG Nullwerte zulässig
ErrorCode UnsignedInt Rückgabecode, der den Erfolg oder das Scheitern der Methode angibt. Hinweis: Der Hexadezimalwert muss in einen Unsignedint-Wert konvertiert werden. Nein
Beschreibung String Fehlertext und Beschreibung, die von der Komponente zurückgegeben werden, die den Fehler generiert hat. Ja
Quelle Zeichenfolge Name der Komponente, die den Fehler generiert hat. Ja
Helpfile Zeichenfolge Pfad oder URL der Hilfedatei oder des Hilfethemas, das den Fehler beschreibt. Ja

Es folgt ein Beispiel für einen SOAP-Fehler für einen fehlgeschlagenen Methodenaufruf:

<?xml version="1.0"?>
 <SOAP-ENV:Envelope
  xmlns:SOAP-ENV="https://schemas.xmlsoap.org/soap/envelope/"
  SOAP-ENV:encodingStyle="https://schemas.xmlsoap.org/soap/encoding/">
  <SOAP-ENV:Fault>
  <faultcode>XMLAnalysisError.0x80000005</faultcode>
  <faultstring>The XML for Analysis provider encountered an
   error</faultstring>
  <faultactor>XML for Analysis Provider</faultactor>
  <detail>
   <faultstring>
    <Error
    ErrorCode="2147483653"
    Description="An unexpected error has occurred"
    Source="XML for Analysis Provider"
    HelpFile=""
    />
   </faultstring>
  </detail>
 </SOAP-ENV:Fault>
</SOAP-ENV:Envelope>

Unterstützung für Statefulness in XML for Analysis

XML for Analysis ist standardmäßig zustandslos. (Zustandslosigkeit ist eine Bedingung, bei der sich der Server nicht an die Identität oder den Kontext eines Clients erinnert, nachdem ein Methodenaufruf abgeschlossen wurde). Um zustandsbehaftet zu sein (eine Bedingung, bei der der Server die Identität und den Kontext eines Clients vom Methodenaufruf bis zum Methodenaufruf beibewahrt), werden Sitzungen für den Anbieter unterstützt. Sitzungen sind nützlich für eine Reihe von Anweisungen, die zusammen ausgeführt werden sollten. Ein Beispiel hierfür ist die Erstellung eines berechneten Members, das in nachfolgenden Abfragen verwendet wird.

Die Unterstützung für Sitzungen auf dem Anbieter ist optional. Der Client kann die Unterstützung testen, indem der Wert der XML for Analysis-Eigenschaft StateSupport über die Discover-Methode überprüft wird. Der Mindestwert für den Zustand ist Sitzungen. Weitere Informationen zur StateSupport-Eigenschaft finden Sie unter XML für Analyseeigenschaften.

Im Allgemeinen folgen Sitzungen dem in der OLE DB-Spezifikation beschriebenen Verhalten wie folgt:

  • Sitzungen definieren Transaktion und Befehlskontextbereich.
  • Mehrere Befehle können im Kontext einer einzelnen Sitzung ausgeführt werden.
  • Die Unterstützung für Transaktionen im XML for Analysis-Kontext wird mit anbieterspezifischen Befehlen behandelt, die mit der Execute-Methode gesendet werden.

XML for Analysis definiert eine Möglichkeit, den Zustand (Sitzungen) in einer Webumgebung in einem Modus zu unterstützen, der dem Ansatz ähnelt, der vom DAV-Protokoll (Distributed Authoring and Versioning) verwendet wird, um die Sperrung in einer lose gekoppelten Umgebung zu implementieren. Diese Spezifikation parallelisiert DAV, da der Anbieter Sitzungen aus verschiedenen Gründen (z. B. Timeout oder Verbindungsfehler) ablaufen darf. Dies bedeutet auch, dass die Webdienste für die Verarbeitung von Befehlssätzen bereit sein müssen, die unterbrochen wurden und neu gestartet werden müssen.

Die SOAP-Spezifikation empfiehlt die Verwendung von SOAP-Headern zum Erstellen neuer Protokolle auf SOAP-Nachrichten. In der folgenden Tabelle sind die SOAP-Headerelemente und -Attribute aufgeführt, die VON XML for Analysis zum Initiieren, Verwalten und Schließen einer Sitzung definiert werden.

SOAP-Header BESCHREIBUNG
BeginSession Fordert den Anbieter auf, eine neue Sitzung zu erstellen. Der Anbieter sollte mit der Erstellung einer neuen Sitzung antworten und die Sitzungs-ID als Teil des Sitzungsheaders in der SOAP-Antwort zurückgeben.
SessionID Der Wertbereich enthält die Sitzungs-ID, die für den Rest der Sitzung in jedem Methodenaufruf verwendet werden muss. Der Anbieter sendet dieses Tag in der SOAP-Antwort, und der Client muss dieses Attribut ebenfalls mit jedem Sitzungsheaderelement senden.
Sitzung Für jeden Methodenaufruf, der in der Sitzung erfolgen soll, muss dieser Header verwendet werden, und die Sitzungs-ID muss im Wertbereich des Headers enthalten sein.
EndSession Verwenden Sie diesen Header, um die Sitzung zu beenden. Die Sitzungs-ID muss im Wertbereich enthalten sein.

Das folgende Beispiel zeigt, wie Sitzungen unterstützt werden:

  1. Um die Sitzung zu beginnen, fügen Sie dem aufruf der ausgehenden XML for Analysis-Methode vom Client einen BeginSession-Header in SOAP hinzu. Der Wertbereich ist zunächst leer, da die Sitzungs-ID noch nicht bekannt ist.

    <SOAP-ENV:Envelope
     xmlns:SOAP-ENV="https://schemas.xmlsoap.org/soap/envelope/"
     SOAP-ENV:encodingStyle="https://schemas.xmlsoap.org/soap/encoding/">
     <SOAP-ENV:Header>
      <XA:BeginSession
       xmlns:XA="urn:schemas-microsoft-com:xml-analysis"
       xsi:type="xsd:int"
       mustUnderstand="1"/>
     </SOAP-ENV:Header>
     <SOAP-ENV:Body>
      ...<!-- Discover or Execute call goes here.-->
     </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    
  2. Die SOAP-Antwortnachricht des Anbieters enthält die Sitzungs-ID im Rückgabeheaderbereich unter Verwendung des XML for Analysis-Headertags <SessionID>.

    <SOAP-ENV:Header>
     <XA:Session
      xmlns:XA="urn:schemas-microsoft-com:xml-analysis"
      SessionID="581"/>
    </SOAP-ENV:Header>
    
  3. Für jeden Methodenaufruf in der Sitzung muss der Sitzungsheader hinzugefügt werden, der die vom Anbieter zurückgegebene Sitzungs-ID enthält.

    <SOAP-ENV:Header>
     <XA:Session
      xmlns:XA="urn:schemas-microsoft-com:xml-analysis"
      mustUnderstand="1"
      SessionID="581"/>
    </SOAP-ENV:Header>
    
  4. Wenn die Sitzung abgeschlossen ist, wird das <EndSession-Tag> verwendet, das den zugehörigen Sitzungs-ID-Wert enthält.

    <SOAP-ENV:Header>
     <XA:EndSession
      xmlns:XA="urn:schemas-microsoft-com:xml-analysis"
      xsi:type="xsd:int"
      mustUnderstand="1"
      SessionID="581"/>
    </SOAP-ENV:Header>
    

Eine Sitzungs-ID garantiert nicht, dass eine Sitzung gültig bleibt. Wenn eine Sitzung abläuft (beispielsweise bei einem Timeout oder wenn die Verbindung verloren geht), kann der Anbieter die Aktionen der Sitzung beenden und rückgängig machen. Daher schlagen alle nachfolgenden Methodenaufrufe vom Client für eine Sitzungs-ID fehl, wobei ein Fehler eine nichtvalid-Sitzung signalisiert. Ein Client verarbeitet diese Bedingung und muss bereit sein, die Sitzungsmethodeaufrufe von Anfang an erneut zu senden.

XML für die Analyse mit Data Mining

Die XML for Analysis Execute-Methode unterstützt die Ausführung von Data Mining-Befehlen. Die Unterstützung von Data Mining-Befehlen ist anbieterspezifisch. Data Mining-Befehle werden auch über die Execute-Schnittstelle unterstützt, wenn die Ergebnisse entweder als MDDataSet oder in tabellarischer Form zurückgegeben werden. Data Mining-Anbieter müssen tabellarische Ergebnisse mindestens unterstützen.

Beispielsweise unterscheidet sich der Zugriff auf OLE DB for Data Mining-Informationen über die XML for Analysis-API nicht wesentlich vom Abrufen von Daten aus einer relationalen Datenquelle. Das Ergebnis von OLE DB für Data Mining-Befehlen ist ein flaches Rowset oder ein flaches Rowset in einer hierarchischen Anordnung. Die Format-Eigenschaft sollte für OLE DB für Data Mining-Befehle auf Tabellarisch festgelegt werden.

XML for Analysis-Anbieter sind nicht erforderlich, um OLE DB für Data Mining-spezifische Befehle zu unterstützen. Anbieter, die OLE DB für Data Mining unterstützen, machen sich selbst verfügbar, indem sie eines der Arrayelemente in ProviderType auf DMP festlegen.

Teil II – Anhänge

Dieser Abschnitt enthält zusätzliche Themen und verwandte Informationen, die Ihnen helfen, diese Spezifikation zu verstehen und zu implementieren.

Anhang A: Implementierungshinweise

Dieser Anhang enthält Diskussionen zu Implementierungsüberlegungen.

Implementierung von XML for Analysis Exemplarische Vorgehensweise

Um besser zu veranschaulichen, wie die XML for Analysis-API verwendet wird, enthält dieser Abschnitt eine exemplarische Vorgehensweise für eine einfache Client/Server-Interaktion. Dies schließt ein, wie eine Implementierung die Liste der Datenquellen abrufen kann.

Die Schritte in der exemplarischen Vorgehensweise beschreiben einen Client, der mit einem Server kommuniziert, um eine Liste von Datenquellen abzurufen und dann eine der Datenquellen zum Ausführen einer OLAP-Abfrage zu verwenden.

Die folgende Notation zeigt, welche Schritte die Spezifikation darstellen und welche Schritte Beispiele für eine Implementierung sind:

  • (I) Der Schritt ist ein Beispiel für eine Implementierung.
  • (S) Der gezeigte Schritt ist ein Element, das wie in dieser Spezifikation beschrieben implementiert wird.

Suchen nach einem XML für Analysis Service

  1. (I) Die Clientanwendung kennt eine Server-URL, die Webdienste unterstützt. Dies können Sie finden, indem Sie eine UDDI-Geschäftsregistrierung (Universal Description, Discovery, And Integration) durchsuchen.

  2. (I) Der Client sendet eine Anforderung an die URL, um herauszufinden, ob er den XML for Analysis Web Service unterstützt (z. B. mithilfe des Ermittlungsprotokolls (DISCO)).

  3. (I) DISCO gibt die URL der WSDL-Datei für den XML for Analysis Web Service (z. B. XMLAnalysis.wsdl) zurück.

  4. (I) Der Client sendet eine Anforderung für die WSDL-Datei.

  5. (I) Der Webserver sendet XMLAnalysis.wsdl zurück, die die unterstützten Methoden definiert: Discover und Execute.

  6. (I) Der Client bestätigt von der WSDL, dass sowohl Client als auch Server die gleichen Methoden verwenden.

  7. (I) Die WSDL-Datei enthält die URL, die für den XML for Analysis Web Service (z. B. XMLAnalysis.asp) verwendet werden soll.

    Im Folgenden ist ein Beispiel für die WSDL aufgeführt, die ein Dienst für XML for Analysis zurückgeben kann:

    <?xml version='1.0' encoding='UTF-8' ?> 
     <!-- Generated 02/08/01 by Microsoft SOAP Toolkit WSDL File Generator,
      Version 1.1 --> 
    <definitions  name ='MSXmlAnalysis'   targetNamespace = 
    'https://schemas.microsoft.com/xmla/MSXmlAnalysis/wsdl'
        xmlns:wsdlns='https://schemas.microsoft.com/xmla/MSXmlAnalysis/wsdl'
        xmlns:typens='https://schemas.microsoft.com/xmla/MSXmlAnalysis/type'
        xmlns:soap='https://schemas.xmlsoap.org/wsdl/soap/'
        xmlns:xsd='http://www.w3.org/2000/10/XMLSchema'
        xmlns:stk='https://schemas.microsoft.com/soap-toolkit/wsdl-extension'
        xmlns='https://schemas.xmlsoap.org/wsdl/'> 
      <types>
        <schema targetNamespace='urn:schemas-microsoft-com:xml-analysis'
          xmlns='http://www.w3.org/2000/10/XMLSchema'>
        </schema>
      </types>
      <message name='XmlAnalysis.Execute'>
        <part name='Command' type='xsd:xmldom'/>
        <part name='Properties' type='xsd:xmldom'/>
      </message>
      <message name='XmlAnalysis.ExecuteResponse'>
        <part name='return' type='xsd:xmldom'/>
      </message>
      <message name='XmlAnalysis.Discover'>
        <part name='RequestType' type='xsd:string'/>
        <part name='Restrictions' type='xsd:xmldom'/>
        <part name='Properties' type='xsd:xmldom'/>
      </message>
      <message name='XmlAnalysis.DiscoverResponse'>
        <part name='return' type='xsd:xmldom'/>
      </message>
      <portType name='XmlAnalysisSoapPort'>
        <operation name='Execute' parameterOrder='Command Properties'>
          <input message='wsdlns:XmlAnalysis.Execute' />
          <output message='wsdlns:XmlAnalysis.ExecuteResponse' />
        </operation>
        <operation name='Discover' parameterOrder='RequestType Restrictions 
    Properties'>
          <input message='wsdlns:XmlAnalysis.Discover' />
          <output message='wsdlns:XmlAnalysis.DiscoverResponse' />
        </operation>
      </portType>
      <binding name='XmlAnalysisSoapBinding' type='wsdlns:XmlAnalysisSoapPort' >
        <stk:binding preferredEncoding='UTF-8'/>
        <soap:binding style='rpc' transport='https://schemas.xmlsoap.org/soap/http' />
        <operation name='Execute' >
          <soap:operation soapAction='urn:schemas-microsoft-com:xml-
           analysis:Execute' />
          <input>
            <soap:body use='encoded' namespace='urn:schemas-microsoft-
             com:xml-analysis'
            encodingStyle='https://schemas.xmlsoap.org/soap/encoding/' />
          </input>
          <output>
            <soap:body use='encoded' namespace='urn:schemas-microsoft-com:xml-analysis'
                encodingStyle='https://schemas.xmlsoap.org/soap/encoding/' />
          </output>
        </operation>
        <operation name='Discover' >
          <soap:operation soapAction='urn:schemas-microsoft-com:xml-
           analysis:Discover' />
          <input>
            <soap:body use='encoded' namespace='urn:schemas-microsoft-
             com:xml-analysis'
               encodingStyle='https://schemas.xmlsoap.org/soap/encoding/' />
          </input>
          <output>
            <soap:body use='encoded' namespace='urn:schemas-microsoft-
             com:xml-analysis'
                encodingStyle='https://schemas.xmlsoap.org/soap/encoding/' />
          </output>
        </operation>
      </binding>
      <service name='MSXmlAnalysis' >
        <port name='XmlAnalysisSoapPort' binding='wsdlns:XmlAnalysisSoapBinding' >
          <soap:address location='https://localhost/xmla/msxisapi.dll' />
        </port>
      </service>
    </definitions>
    

Abrufen einer Datenquelle

  1. (S) Der Client sucht nach OLAP-Datenquellen, indem er die oben abgerufene URL und Die Methodeninformationen verwendet, um einen Discover-Aufruf von RequestType DISCOVER_DATASOURCES zu senden. Im Parameter Restrictions gibt er MDP (mehrdimensionale Daten) für ProviderType an.
  2. (I) Die Liste der veröffentlichten Datenquellen ist eine XML-Datei auf dem Server, die vom Anwendungsadministrator verwaltet wird. XMLAnalysis.asp ruft das XML-Dokument ab und sendet es an die Clientanwendung.
  3. (I) Der Client analysiert das Rowset und wählt die zu verwendende Datenquelle aus. Wenn sich die für die Datenquelle aufgeführte URL von der URL unterscheidet, die zuerst für die ursprüngliche Discover-Methode verwendet wurde, muss die zweite, datenquellenspezifische URL für alle weiteren Discover - und Execute-Aufrufe verwendet werden, um mit diesen Daten in dieser Quelle zu arbeiten.

Verwenden der Datenquelle

  1. (S) Der Client sendet einen Discover-Befehl an die ausgewählte OLAP-Datenquelle. Verwenden Sie die RequestType-MDSCHEMA_CUBES, um eine Liste aller verfügbaren Cubes abzurufen. Einschränkungen enthält den Namen einer Datenbank, die nach FoodMart 2000 gesucht werden soll. Die informationen, die zum Herstellen einer Verbindung mit dem Anbieter erforderlich sind, sind im Properties-Parameter enthalten.

  2. Im Folgenden ist ein Beispiel für den XML-Code angegeben, der vom Client für diesen Aufruf gesendet wird:

    SOAPAction: "urn:schemas-microsoft-com:xml-analysis:Discover"
    <SOAP-ENV:Envelope 
     xmlns:SOAP-ENV="https://schemas.xmlsoap.org/soap/envelope/" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     <SOAP-ENV:Body>
      <Discover xmlns="urn:schemas-microsoft-com:xml-analysis" 
      SOAP-ENV:encodingStyle="https://schemas.xmlsoap.org/soap/encoding/">
       <RequestType>MDSCHEMA_CUBES</RequestType>
        <Restrictions>
          <RestrictionList>
          <CATALOG_NAME>
           FoodMart 2000
          </CATALOG_NAME>
         </RestrictionList>
        </Restrictions>
       <Properties>
        <PropertyList>
         <DataSourceInfo>
          Provider=MSOLAP;Data Source=local;
         </DataSourceInfo>
         <Catalog>
          Foodmart 2000
         </Catalog>
        </PropertyList>
       </Properties>
      </Discover>
     </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    
  3. (I) Der XML for Analysis-Anbieter verarbeitet die Anforderung und sendet sie an die OLAP-Datenquelle. Nachdem die verfügbaren Cubedaten empfangen wurden, packt der Anbieter sie als XML und sendet sie an die anfordernde Clientanwendung zurück.

  4. Es folgt ein Beispiel für die XML-Datei, die vom Server mit den Daten gesendet wird:

    <?xml version="1.0"?>
    <SOAP-ENV:Envelope
     xmlns:SOAP-ENV="https://schemas.xmlsoap.org/soap/envelope/"
     SOAP-ENV:encodingStyle="https://schemas.xmlsoap.org/soap/encoding/">
     <SOAP-ENV:Body>
      <DiscoverResponse xmlns="urn:schemas-microsoft-com:xml-analysis">
       <return>
        <root>
         <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          <!-- The XML schema definition of the result comes here -->
          ...
         </xsd:schema>
         <row>
          <CATALOG_NAME>FoodMart 2000</CATALOG_NAME>
          <CUBE_NAME>Sales</CUBE_NAME>
          ...
         </row>
         <row>
          <CATALOG_NAME>FoodMart 2000</CATALOG_NAME>
          <CUBE_NAME>Warehouse</CUBE_NAME>
          ...
         </row>
         ...
        </root>
       </return>
      </DiscoverResponse>
     </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    
  5. (S) Der Client wählt einen Cube aus und sendet dann ein Execute-Element, das ein <Statement-Element> enthält, das eine MDX SELECT-Anweisung enthält: "Select Measures,Members on Columns from Sales". Verbindungsinformationen werden erneut im Properties-Parameter bereitgestellt.

    SOAPAction: "urn:schemas-microsoft-com:xml-analysis:Execute"
    <SOAP-ENV:Envelope 
     xmlns:SOAP-ENV="https://schemas.xmlsoap.org/soap/envelope/" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     <SOAP-ENV:Body>
      <Execute xmlns="urn:schemas-microsoft-com:xml-analysis" 
      SOAP-ENV:encodingStyle="https://schemas.xmlsoap.org/soap/encoding/">
       <Command>
    <Statement>
    select [Measures].members on Columns from Sales
    </Statement>
    </Command>
       <Properties>
        <PropertyList>
         <DataSourceInfo>
          Provider=MSOLAP;Data Source=local;
         </DataSourceInfo>
         <Catalog>
          Foodmart 2000
         </Catalog>
         <Format>
          Multidimensional
         </Format>
           <AxisFormat>
             TupleFormat
          </AxisFormat>
        </PropertyList>
       </Properties>
      </Execute>
     </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    
  6. (I) Der XML for Analysis-Anbieter analysiert die Anforderung und sendet sie an die zu füllende Datenquelle.

  7. (I) Wenn das Dataset zurückgegeben wird, packt der Anbieter es in XML und sendet es zurück an die anfordernde Clientanwendung, wie im folgenden Beispiel veranschaulicht:

    <?xml version="1.0"?>
    <SOAP-ENV:Envelope
     xmlns:SOAP-ENV="https://schemas.xmlsoap.org/soap/envelope/"
     SOAP-ENV:encodingStyle="https://schemas.xmlsoap.org/soap/encoding/">
     <SOAP-ENV:Body>
      <ExecuteResponse xmlns="urn:schemas-microsoft-com:xml-analysis">
       <return>
        <root>
         <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          <!-- The XML schema definition of the result comes here -->
          ...
         </xsd:schema>
         <OlapInfo>
          <!—  Dimension information comes here  -->
         </OlapInfo>
         <Axes>
          <!—  Axis information for the MDDataSet result axes comes here  -->
         </Axes>
         <CellData>
          <!—  Cell data values and properties come here  -->
         </CellData> 
        </root>
       </return>
      </ExecuteResponse>
     </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    
  8. (I) Der Client empfängt das Resultset und führt alle zusätzlichen Aufgaben aus, die vom Benutzer benötigt werden. Beispielsweise könnte eine Clientanwendung das Resultset mit XSL formatieren und die Daten als Tabelle darstellen, die der Benutzer auf einer Webseite durchsuchen kann. Eine Clientanwendung kann das Resultset auch lokal zwischenspeichern, um Roundtrips zu minimieren, wenn der Benutzer die angezeigten Daten aktualisiert.

XML für Analysen und Nicht-Webanwendungen

Die XML for Analysis-API ist für Webanwendungen optimiert. Dies verhindert jedoch nicht, dass diese Methodik für LAN-orientierte Anwendungen genutzt wird. Die folgenden Anwendungen können von dieser XML-basierten API profitieren:

  • Client-/Serveranwendungen, die technologieflexibilität zwischen Clients und Server erfordern
  • Client/Server-Anwendungen, die auf mehrere Betriebssysteme abzielen
  • Clients, die keinen aussagekräftigen Status benötigen, um die Serverkapazität zu erhöhen

Anhang B: Schnell-SOAP-Glossar

Simple Object Access Protocol (SOAP) ist ein Branchenstandard für die Verwendung von XML zur erweiterbaren Darstellung von Daten und Befehlen. Da SOAP ein integraler Bestandteil dieser Spezifikation ist, enthält dieser Abschnitt Hintergrundinformationen und definiert die SOAP-Terminologie.

  • Webdienst
    Im Allgemeinen ist ein Webdienst eine Anwendung, die als Dienst bereitgestellt wird und mithilfe von Internetstandards in andere Webdienste integriert werden kann. Es handelt sich um eine URL-adressierbare Ressource, die programmgesteuert Informationen an Clients zurückgibt, die sie verwenden möchten.

    Webdienste stellen Blackboxfunktionen dar, die wiederverwendet werden können, ohne sich speziell mit der Implementierung eines Diensts befassen zu müssen. Webdienste stellen klar definierte Schnittstellen bereit, die als Verträge bezeichnet werden und die die bereitgestellten Dienste beschreiben. Ein Webdienst kann SOAP verwenden, um seine Nachrichtenformate anzugeben.

  • SOAP
    SOAP ist ein einfaches Protokoll zum Austausch von Informationen in einer dezentralen, verteilten Umgebung. Es handelt sich um ein XML-basiertes Protokoll, das aus drei Teilen besteht:

    • Ein Umschlag, der ein Framework definiert, um zu beschreiben, was in einer Nachricht enthalten ist und wie sie verarbeitet werden soll.
    • Eine Reihe von Codierungsregeln zum Ausdrücken von Instanzen anwendungsdefinierter Datentypen
    • Konvention zum Darstellen von Remoteprozeduraufrufen und -antworten

    Hier sehen Sie eine SOAP-Beispielanforderung:

    <SOAP-ENV:Envelope 
    xmlns:SOAP-ENV="https://schemas.xmlsoap.org/soap/envelope/" SOAP-
     ENV:encodingStyle="https://schemas.xmlsoap.org/soap/encoding/">
     <SOAP-ENV:Body>
      <m:GetLastTradePrice xmlns:m="Some-URI">
       <symbol>DIS</symbol>
      </m:GetLastTradePrice>
     </SOAP-ENV:Body>
    </SOAP-ENV:Envelope> 
    

    Die entsprechende Datenantwort kann wie folgt aussehen:

    <SOAP-ENV:Envelope 
    xmlns:SOAP-ENV="https://schemas.xmlsoap.org/soap/envelope/" SOAP-
     ENV:encodingStyle="https://schemas.xmlsoap.org/soap/encoding/"/>
     <SOAP-ENV:Body>
      <m:GetLastTradePriceResponse xmlns:m="Some-URI">
       <Price>34.5</Price>
      </m:GetLastTradePriceResponse>
     </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    
  • Web Services Description Language (WSDL)
    Da Kommunikationsprotokolle und Nachrichtenformate in der Webcommunity standardisiert sind, wird es zunehmend möglich und wichtig, die Kommunikation strukturiert beschreiben zu können. Web Services Description Language (WSDL) erfüllt diese Anforderung, indem eine XML-Grammatik zum Beschreiben von Netzwerkdiensten als Sammlungen von Kommunikationsendpunkten definiert wird, die Nachrichten austauschen können. WSDL-Dienstdefinitionen stellen Dokumentation für verteilte Systeme bereit und dienen als Rezept für die Automatisierung der Details, die an der Anwendungskommunikation beteiligt sind.

    Ein WSDL-Dokument definiert Dienste als Sammlungen von Netzwerkendpunkten oder Ports. In WSDL wird die abstrakte Definition von Endpunkten und Nachrichten von ihren konkreten Netzwerkbereitstellungs- oder Datenformatbindungen getrennt. Dies ermöglicht die Wiederverwendung von abstrakten Definitionen:

    • Nachrichten, bei denen es sich um abstrakte Beschreibungen der ausgetauschten Daten handelt
    • Porttypen, bei denen es sich um abstrakte Auflistungen von Vorgängen handelt

    Die konkreten Protokoll- und Datenformatspezifikationen für einen bestimmten Porttyp stellen eine wiederverwendbare Bindung dar. Ein Port wird definiert, indem eine Netzwerkadresse einer wiederverwendbaren Bindung zugeordnet wird. Eine Sammlung von Ports definiert einen Dienst.

    Einen Link zu ausführlicheren Informationen zu WSDL finden Sie in Anhang E.

Anhang C: XML for Analysis to OLE DB Mapping

Da XML for Analysis auf Definitionen aufbaut, die in OLE DB beschrieben sind, können weitere Informationen mithilfe der OLE DB-Spezifikation für die genannten Bereiche abgerufen werden.

Funktionszuordnung

In der folgenden Tabelle werden OLE DB und OLE DB für OLAP äquivalentem XML für Analyseaktionen zugeordnet. Nicht alle OLE DB-Funktionen verfügen über eine XML for Analysis-Zuordnung, da nicht alle Aktionen gelten. Beispielsweise werden Methoden, die auf Navigationsmethoden abzielen, die zum Bearbeiten eines Rowsets nach dem Empfang verwendet würden, nicht angewendet, da der Client dies verarbeitet.

OLE DB-Schnittstelle und -Befehl XML-Implementierung
IColumnsInfo::GetColumnInfo Execute-Methode :

Eigenschaften:

Content = Schema

ICommandPrepare::P repare Execute-Methode :

Eigenschaften:

Inhalt = Keine.

(Nur zum Überprüfen eines Befehls)

ICommandProperties::GetProperties Discover-Methode :

RequestType:

DISCOVER_PROPERTIES

ICommandProperties::SetProperties Execute-Methode :

Eigenschaften:

<Angeben der zu aktualisierenden Eigenschaft>

Hinweis: Die Eigenschaft muss über Lese-/Schreibberechtigungen verfügen.

ICommandText::SetCommandText Execute-Methode :

Befehlsparameter .

IDBInfo::GetKeywords Discover-Methode :

RequestType:

DISCOVER_KEYWORDS

IDBInfo::GetLiteralInfo Discover-Methode :

RequestType:

DISCOVER_LITERALS

OLE DB-Schnittstelle und -Befehl
(Fortsetzung)
XML-Implementierung (Fortsetzung)
IDBProperties::GetProperties Discover-Methode :

RequestType:

DISCOVER_PROPERTIES

IdbProperties::GetPropertyInfo Discover-Methode :

RequestType:

DISCOVER_PROPERTIES

IDBProperties::SetProperties Execute-Methode :

Eigenschaften:

<Geben Sie die zu aktualisierende Eigenschaft an.>

Hinweis: Die Eigenschaft muss über Lese-/Schreibberechtigungen verfügen.

IGetDataSource::GetDataSource Discover-Methode :

RequestType:

DISCOVER_DATASOURCES

IMDDataset::FreeAxisInfo

IMDDataset::GetAxisRowset

IMDDataset::GetCellData

IMDDataset::GetSpecification

(Keine direkte Zuordnung)

Verwenden Sie die Discover-Methode , um die Metadatenstruktur (z. B. Zeilen- und Spalteninformationen) des Rowsets abzurufen:

Eigenschaften:

Inhalt = Schema

IMDRangeRowset::GetRangeRowset (Keine direkte Zuordnung.)

Execute-Methode :

Befehle:

<Anbieterspezifische Abfrageanweisung>

Eigenschaften:

BeginRange = <ganzzahliger Wert>

EndRange = <ganzzahliger Wert>

ISessionProperties::GetProperties Discover-Methode :

RequestType:

DISCOVER_PROPERTIES

(Sitzung wird impliziert)

ISessionProperties::SetProperties Execute-Methode :

Eigenschaften:

<Geben Sie die zu aktualisierende Eigenschaft an.>

Hinweis: Die Eigenschaft muss über Lese-/Schreibberechtigungen verfügen.

Eigenschaftenzuordnung

In der folgenden Tabelle sind einige gängige OLE DB-Eigenschaften für äquivalente XML for Analysis-Eigenschaften aufgeführt.

OLE DB-Eigenschaft XML-Implementierung
DBPROP_INIT_PROVIDERSTRING

(DBPROPSET_DBINIT Eigenschaftensatz)

DataSourceInfo-Eigenschaft
DBPROP_COMMANDTIMEOUT

DBPROP_INIT_TIMEOUT

DBPROP_INIT_GENERALTIMEOUT

(DBPROPSET_DBINIT Eigenschaftensatz)

Timeout-Eigenschaft

RequestTypes-Zuordnung

Diese Tabelle zeigt die Zuordnung der RequestTypes-Enumerationswerte zu OLE DB.

OLE DB-Zuordnung XML for Analysis-Anforderungstyp
Nicht verfügbar DISCOVER_DATASOURCES
IDBProperties::GetPropertyInfo und

IDBProperties::GetProperties-Funktionen

DISCOVER_PROPERTIES
IDBSchemaRowset::GetSchemas DISCOVER_SCHEMA_ROWSETS
Nicht verfügbar DISCOVER_ENUMERATORS
IDBInfo::GetKeywords DISCOVER_KEYWORDS
IDBInfo::GetLiteralInfo DISCOVER_LITERALS
Die Namen und Definitionen des OLE DB-Schemarowsets sind in "Anhang B: Schemarowsets" in der OLE DB-Spezifikation aufgeführt. <Schemarowsetkonstante>

OLE DB-zu-XML-Datentypzuordnung

Als Referenz ordnet die folgende Tabelle OLE DB-Datentypen veröffentlichten XML-Schematypen zu.

Weitere Informationen und Definitionen der XML-Schematypen sind unter http://www.w3.org/TR/xmlschema-2/verfügbar. Informationen zum Anzeigen der XML-Schemastruktur finden Sie auf der W3C-Website.

OLE DB-Typ XML-Schematyp
DBTYPE_I1 byte
DBTYPE_I2 short
DBTYPE_I4 INT
DBTYPE_I8 long
DBTYPE_UI1 unsignedByte
DBTYPE_UI2 unsignedShort
DBTYPE_UI4 unsignedInt
DBTYPE_UI8 unsignedLong
DBTYPE_R4 float
DBTYPE_R8 double
DBTYPE_BOOL boolean
DBTYPE_CY Decimal
DBTYPE_ERROR Zeichenfolge
DBTYPE_DECIMAL Decimal
DBTYPE_NUMERIC Decimal
DBTYPE_DATE date
DBTYPE_DBTIMESTAMP time
DBTYPE_GUID Zeichenfolge
DBTYPE_BYTES BINARY
DBTYPE_STR Zeichenfolge
DBTYPE_WSTR Zeichenfolge
DBTYPE_BSTR Zeichenfolge
DBTYPE_VARIANT Zeichenfolge

MDDataSet-Datentypzuordnung zu OLE DB

Dies ist die OLE DB-Zuordnung für den XML for Analysis-Datentyp von MDDataset und weitere Referenzinformationen.

OLE DB-Implementierung Implementierung von XML for Analysis
OLE DB für OLAP-Datasettyp

Zugriff über die IMDDataset-Schnittstelle

MDDataset-Datentyp

Beziehung zwischen MDX und mdXML

Multidimensional Expressions (MDX) ist die mehrdimensionale Ausdruckssprache, die in der OLE DB for OLAP-Spezifikation definiert ist. Die mdXML-Sprache ist eine XML-gekapselte Version der MDX-Sprache. Ab der ersten Version dieser Spezifikation ist das einzige XML-Element für mdXML das <Statement-Element> , das für mehrdimensionale Anbieter aus einer MDX-Sprachanweisung besteht, die zuvor in dieser Spezifikation beschrieben wurde. In Zukunft wird mdXML um zusätzliche Elemente und Features erweitert. Die Erweiterungen von mdXML basieren auf der MDX-Sprache, die weiterhin in XML for Analysis über das <Statement-Element> verfügbar bleibt.

Die MDX-Sprache selbst ist erweiterbar, sodass Anbieter Erweiterungen zur Sprache hinzufügen können, um zusätzliche Features zu unterstützen, die nicht im Basissprachensatz bereitgestellt werden. Eine zukünftige Version dieser Spezifikation definiert eine mdXML-Sprache, die auf MDX basiert.

Die MDX-Sprachspezifikation ist Teil der OLE DB für OLAP-Spezifikation und finden Sie unter dem Speicherort, auf den für OLE DB für OLAP-Informationen in Anhang E verwiesen wird.

Anhang D: MDDataSet-Beispiel

Es folgt ein vollständiges Beispiel für ein MDDataSet-Antwortergebnisset mit AxisFormat=TupleFormat. Der XSD-Abschnitt wird zuerst angezeigt, gefolgt vom MDDataSet-Ergebnis.

<?xml version="1.0" encoding="UTF-16"?>
<root xmlns="urn:schemas-microsoft-com:xml-analysis:mddataset"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <xsd:schema targetNamespace="urn:schemas-microsoft-com:xml-
analysis:mddataset" elementFormDefault="qualified" xmlns:sql="urn:schemas-
microsoft-com:xml-sql">
        <xsd:complexType name="MemberType">
            <xsd:attribute name="Hierarchy"
             type="xsd:string"></xsd:attribute>
            <xsd:sequence>
                <xsd:element name="UName" type="xsd:string"></xsd:element>
                <xsd:element name="Caption"
                 type="xsd:string"></xsd:element>
                <xsd:element name="LName" type="xsd:string"></xsd:element>
        
                <xsd:element name="LNum"
                 type="xsd:unsignedInt"></xsd:element>
                <xsd:element name="DisplayInfo"
                 type="xsd:unsignedInt"></xsd:element>
                <xsd:sequence maxOccurs="unbounded" minOccurs="0">
                    <xsd:any processContents="lax"
                     maxOccurs="unbounded"></xsd:any>
                </xsd:sequence>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:complexType name="PropType">
            <xsd:attribute name="name" 
type="xsd:string"></xsd:attribute>
        </xsd:complexType>
        <xsd:complexType name="TupleType">
            <xsd:sequence maxOccurs="unbounded">
                <xsd:element name="Member"
                 type="MemberType"></xsd:element>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:complexType name="MembersType">
            <xsd:attribute name="Hierarchy"
             type="xsd:string"></xsd:attribute>
            <xsd:sequence maxOccurs="unbounded">
                <xsd:element name="Member"
                 type="MemberType"></xsd:element>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:complexType name="TuplesType">
            <xsd:sequence maxOccurs="unbounded">
                <xsd:element name="Tuple" type="TupleType"></xsd:element>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:complexType name="CrossProductType">
            <xsd:choice minOccurs="0" maxOccurs="unbounded">
                <xsd:element name="Members"
                 type="MembersType"></xsd:element>
                <xsd:element name="Tuples"
                 type="TuplesType"></xsd:element>
            </xsd:choice>
        </xsd:complexType>
        <xsd:complexType name="OlapInfo">
            <xsd:sequence maxOccurs="unbounded">
                <xsd:element name="AxesInfo">
                    <xsd:complexType>
                        <xsd:sequence maxOccurs="unbounded">
                            <xsd:element name="AxisInfo">
                                <xsd:complexType>
                                    <xsd:attribute name="name"
                                     type="xsd:string"></xsd:attribute>
                                    <xsd:sequence maxOccurs="unbounded">
                                        <xsd:element name="HierarchyInfo">
                                            <xsd:complexType>
                                                <xsd:attribute name="name"
                                                 type="xsd:string">
                                                 </xsd:attribute>
                                                <xsd:sequence>
                                                    <xsd:sequence
                                                     maxOccurs="unbounded">
                                                        <xsd:element
                                                         name="UName"
                                                         type="PropType">
                                                         </xsd:element>
                                                        <xsd:element
                                                         name="Caption"
                                                         type="PropType">
                                                         </xsd:element>
                                                        <xsd:element
                                                         name="LName"
                                                         type="PropType">
                                                         </xsd:element>
                                                        <xsd:element
                                                         name="LNum"
                                                         type="PropType">
                                                         </xsd:element>
                                                        <xsd:element
                                                         name="DisplayInfo"
                                                         type="PropType">
                                                         </xsd:element>
                                                    </xsd:sequence>
                                                
    <xsd:sequence maxOccurs="unbounded" minOccurs="0">
                                                        <xsd:any
                                                         processContents="lax"
                                                         maxOccurs="unbounded">
                                                         </xsd:any>
                                                    </xsd:sequence>
                                                </xsd:sequence>
                                            </xsd:complexType>
                                        </xsd:element>
                                    </xsd:sequence>
                                </xsd:complexType>
                            </xsd:element>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="CellInfo">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:sequence maxOccurs="unbounded">
                                <xsd:choice>
                                    <xsd:element name="Value"
                                     type="PropType"></xsd:element>
                                    <xsd:element name="FmtValue"
                                     type="PropType"></xsd:element>
                                    <xsd:element name="BackColor"
                                     type="PropType"></xsd:element>
                                    <xsd:element name="ForeColor"
                                     type="PropType"></xsd:element>
                                    <xsd:element name="FontName"
                                     type="PropType"></xsd:element>
                                    <xsd:element 
                                     name="FontSize"
                                     type="PropType"></xsd:element>
                                    <xsd:element name="FontFlags"
                                     type="PropType"></xsd:element>
                                    <xsd:element name="FormatString"
                                     type="PropType"></xsd:element>
                                    <xsd:element name="NonEmptyBehavior"
                                     type="PropType"></xsd:element>
                                    <xsd:element name="SolveOrder"
                                     type="PropType"></xsd:element>
                                    <xsd:element name="Updateable"
                                     type="PropType"></xsd:element>
                                    <xsd:element name="Visible"
                                     type="PropType"></xsd:element>
                                    <xsd:element name="Expression"
                                     type="PropType"></xsd:element>
                                </xsd:choice>
                            </xsd:sequence>
                            <xsd:sequence maxOccurs="unbounded"
                             minOccurs="0">
                                <xsd:any processContents="lax"
                                 maxOccurs="unbounded"></xsd:any>
                            </xsd:sequence>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:complexType name="Axes">
            <xsd:sequence maxOccurs="unbounded">
                <xsd:element name="Axis">
                    <xsd:complexType>
                        <xsd:attribute name="name"
                         type="xsd:string"></xsd:attribute>
                        <xsd:choice minOccurs="0" 
                         maxOccurs="unbounded">
                            <xsd:element name="CrossProduct"
                             type="CrossProductType"></xsd:element>
                            <xsd:element name="Tuples"
                             type="TuplesType"></xsd:element>
                            <xsd:element name="Members"
                             type="MembersType"></xsd:element>
                        </xsd:choice>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:complexType name="CellData">
            <xsd:sequence maxOccurs="unbounded">
                <xsd:element name="Cell">
                    <xsd:complexType>
                        <xsd:attribute name="CellOrdinal"
                         type="xsd:unsignedInt"></xsd:attribute>
                        <xsd:sequence maxOccurs="unbounded">
                            <xsd:choice>
                                <xsd:element name="Value"></xsd:element>
                                <xsd:element name="FmtValue"
                                 type="xsd:string"></xsd:element>
                                <xsd:element name="BackColor"
                                 type="xsd:unsignedInt"></xsd:element>
                                <xsd:element name="ForeColor"
                                 type="xsd:unsignedInt"></xsd:element>
                                <xsd:element name="FontName"
                                 type="xsd:string"></xsd:element>
                                <xsd:element name="FontSize"
                                 type="xsd:unsignedShort"></xsd:element>
                                <xsd:element name="FontFlags"
                                 type="xsd:unsignedInt"></xsd:element>
                                <xsd:element 
                                 name="FormatString"
                                 type="xsd:string"></xsd:element>
                                <xsd:element name="NonEmptyBehavior"
                                 type="xsd:unsignedShort"></xsd:element>
                                <xsd:element name="SolveOrder"
                                 type="xsd:unsignedInt"></xsd:element>
                                <xsd:element name="Updateable"
                                 type="xsd:unsignedInt"></xsd:element>
                                <xsd:element name="Visible"
                                 type="xsd:unsignedInt"></xsd:element>
                                <xsd:element name="Expression"
                                 type="xsd:string"></xsd:element>
                            </xsd:choice>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:element name="root">
            <xsd:complexType>
                <xsd:sequence maxOccurs="unbounded">
                    <xsd:element name="OlapInfo"
                     type="OlapInfo"></xsd:element>
                    <xsd:element name="Axes" type="Axes"></xsd:element>
                    <xsd:element name="CellData"
                     type="CellData"></xsd:element>
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>
    </xsd:schema>
</root>

Das MDDataSet-Abfrageergebnis ist unten dargestellt.

    <OlapInfo>
        <AxesInfo>
            <AxisInfo name="Axis0">
                <HierarchyInfo name="Measures">
                    <UName name="[Measures].[MEMBER_UNIQUE_NAME]"></UName>
                    <Caption name="[Measures].[MEMBER_CAPTION]"></Caption>
                    <LName name="[Measures].[LEVEL_UNIQUE_NAME]"></LName>
                    <LNum name="[Measures].[LEVEL_NUMBER]"></LNum>
                    <DisplayInfo name="[Measures].[DISPLAY_INFO]"></DisplayInfo>
                </HierarchyInfo>
            </AxisInfo>
            <AxisInfo name="Axis1">
                <HierarchyInfo name="Store">
                    <UName name="[Store].[MEMBER_UNIQUE_NAME]"></UName>
                    <Caption name="[Store].[MEMBER_CAPTION]"></Caption>
                    <LName name="[Store].[LEVEL_UNIQUE_NAME]"></LName>
                    <LNum name="[Store].[LEVEL_NUMBER]"></LNum>
                    <DisplayInfo name="[Store].[DISPLAY_INFO]"></DisplayInfo>
                </HierarchyInfo>
                <HierarchyInfo name="Time">
                    <UName name="[Time].[MEMBER_UNIQUE_NAME]"></UName>
                    <Caption 
name="[Time].[MEMBER_CAPTION]"></Caption>
                    <LName name="[Time].[LEVEL_UNIQUE_NAME]"></LName>
                    <LNum name="[Time].[LEVEL_NUMBER]"></LNum>
                    <DisplayInfo
                     name="[Time].[DISPLAY_INFO]"></DisplayInfo>
                </HierarchyInfo>
            </AxisInfo>
            <AxisInfo name="SlicerAxis">
                <HierarchyInfo name="Product">
                    <UName name="[Product].[MEMBER_UNIQUE_NAME]"></UName>
                    <Caption name="[Product].[MEMBER_CAPTION]"></Caption>
                    <LName name="[Product].[LEVEL_UNIQUE_NAME]"></LName>
                    <LNum name="[Product].[LEVEL_NUMBER]"></LNum>
                    <DisplayInfo name="[Product].[DISPLAY_INFO]"></DisplayInfo>
                </HierarchyInfo>
                <HierarchyInfo name="Promotion Media">
                    <UName name="[Promotion Media].[MEMBER_UNIQUE_NAME]"></UName>
                    <Caption name="[Promotion Media].[MEMBER_CAPTION]"></Caption>
                    <LName name="[Promotion Media].[LEVEL_UNIQUE_NAME]"></LName>
                    <LNum name="[Promotion Media].[LEVEL_NUMBER]"></LNum>
                    <DisplayInfo name="[Promotion Media].[DISPLAY_INFO]"></DisplayInfo>
                </HierarchyInfo>
                <HierarchyInfo name="Promotions">
                    <UName 
name="[Promotions].[MEMBER_UNIQUE_NAME]"></UName>
                    <Caption name="[Promotions].[MEMBER_CAPTION]"></Caption>
                    <LName name="[Promotions].[LEVEL_UNIQUE_NAME]"></LName>
                    <LNum name="[Promotions].[LEVEL_NUMBER]"></LNum>
                    <DisplayInfo name="[Promotions].[DISPLAY_INFO]"></DisplayInfo>
                </HierarchyInfo>
                <HierarchyInfo name="Customers">
                    <UName name="[Customers].[MEMBER_UNIQUE_NAME]"></UName>
                    <Caption name="[Customers].[MEMBER_CAPTION]"></Caption>
                    <LName name="[Customers].[LEVEL_UNIQUE_NAME]"></LName>
                    <LNum name="[Customers].[LEVEL_NUMBER]"></LNum>
                    <DisplayInfo name="[Customers].[DISPLAY_INFO]"></DisplayInfo>
                </HierarchyInfo>
                <HierarchyInfo name="Education Level">
                    <UName name="[Education
                     Level].[MEMBER_UNIQUE_NAME]"></UName>
                    <Caption name="[Education
                     Level].[MEMBER_CAPTION]"></Caption>
                    <LName name="[Education
                     Level].[LEVEL_UNIQUE_NAME]"></LName>
                    <LNum name="[Education Level].[LEVEL_NUMBER]"></LNum>
                    <DisplayInfo name="[Education
                     Level].[DISPLAY_INFO]"></DisplayInfo>
                </HierarchyInfo>
                <HierarchyInfo name="Gender">
                    <UName 
name="[Gender].[MEMBER_UNIQUE_NAME]"></UName>
                    <Caption name="[Gender].[MEMBER_CAPTION]"></Caption>
                    <LName name="[Gender].[LEVEL_UNIQUE_NAME]"></LName>
                    <LNum name="[Gender].[LEVEL_NUMBER]"></LNum>
                    <DisplayInfo
                     name="[Gender].[DISPLAY_INFO]"></DisplayInfo>
                </HierarchyInfo>
                <HierarchyInfo name="Marital Status">
                    <UName name="[Marital
                     Status].[MEMBER_UNIQUE_NAME]"></UName>
                    <Caption name="[Marital
                     Status].[MEMBER_CAPTION]"></Caption>
                    <LName name="[Marital Status].[LEVEL_UNIQUE_NAME]"></LName>
                    <LNum name="[Marital Status].[LEVEL_NUMBER]"></LNum>
                    <DisplayInfo name="[Marital
                     Status].[DISPLAY_INFO]"></DisplayInfo>
                </HierarchyInfo>
                <HierarchyInfo name="Store Size in SQFT">
                    <UName name="[Store Size in
                     SQFT].[MEMBER_UNIQUE_NAME]"></UName>
                    <Caption name="[Store Size in
                     SQFT].[MEMBER_CAPTION]"></Caption>
                    <LName name="[Store Size in
                     SQFT].[LEVEL_UNIQUE_NAME]"></LName>
                    <LNum name="[Store Size in
                     SQFT].[LEVEL_NUMBER]"></LNum>
                    <DisplayInfo name="[Store Size in
                     SQFT].[DISPLAY_INFO]"></DisplayInfo>
                </HierarchyInfo>
                <HierarchyInfo name="Store Type">
                    <UName name="[Store
                     Type].[MEMBER_UNIQUE_NAME]"></UName>
                    <Caption name="[Store
                     Type].[MEMBER_CAPTION]"></Caption>
                    <LName name="[Store
                     Type].[LEVEL_UNIQUE_NAME]"></LName>
                    <LNum name="[Store Type].[LEVEL_NUMBER]"></LNum>
                    <DisplayInfo name="[Store
                     Type].[DISPLAY_INFO]"></DisplayInfo>
                </HierarchyInfo>
                <HierarchyInfo name="Yearly Income">
                    <UName name="[Yearly
                     Income].[MEMBER_UNIQUE_NAME]"></UName>
                    <Caption name="[Yearly
                     Income].[MEMBER_CAPTION]"></Caption>
                    <LName name="[Yearly
                     Income].[LEVEL_UNIQUE_NAME]"></LName>
                    <LNum name="[Yearly Income].[LEVEL_NUMBER]"></LNum>
                    <DisplayInfo name="[Yearly
                     Income].[DISPLAY_INFO]"></DisplayInfo>
                </HierarchyInfo>
            </AxisInfo>
        </AxesInfo>
        <CellInfo>
            <Value name="VALUE"></Value>
            <FmtValue name="FORMATTED_VALUE"></FmtValue>
        </CellInfo>
    </OlapInfo>
    <Axes>
        <Axis name="Axis0">
            <Tuples>
                <Tuple>
                    <Member Hierarchy="Measures">
                        <UName>[Measures].[Unit Sales]</UName>
                        <Caption>Unit Sales</Caption>
                        <LName>[Measures].[MeasuresLevel]</LName>
                        <LNum>0</LNum>
                        <DisplayInfo>131072</DisplayInfo>
                    </Member>
                </Tuple>
                <Tuple>
                    <Member Hierarchy="Measures">
                        <UName>[Measures].[Store Cost]</UName>
                        <Caption>Store Cost</Caption>
                        <LName>[Measures].[MeasuresLevel]</LName>
                        <LNum>0</LNum>
                        <DisplayInfo>131072</DisplayInfo>
                    </Member>
                </Tuple>
                <Tuple>
                    <Member Hierarchy="Measures">
                        <UName>[Measures].[Store Sales]</UName>
                        <Caption>Store Sales</Caption>
                        <LName>[Measures].[MeasuresLevel]</LName>
                        <LNum>0</LNum>
                        <DisplayInfo>131072</DisplayInfo>
                    </Member>
                </Tuple>
                <Tuple>
                    <Member Hierarchy="Measures">
                        <UName>[Measures].[Sales Count]</UName>
                        <Caption>Sales Count</Caption>
                        <LName>[Measures].[MeasuresLevel]</LName>
                        <LNum>0</LNum>
                        <DisplayInfo>131072</DisplayInfo>
                    </Member>
                </Tuple>
            </Tuples>
        </Axis>
        <Axis name="Axis1">
            <Tuples>
                <Tuple>
                    <Member Hierarchy="Store">
                        <UName>[Store].[All Stores].[USA].[CA]</UName>
                        <Caption>CA</Caption>
                        <LName>[Store].[Store State]</LName>
                        <LNum>2</LNum>
                        <DisplayInfo>131077</DisplayInfo>
                    </Member>
                    <Member Hierarchy="Time">
                        <UName>[Time].[1997].[Q1]</UName>
                        <Caption>Q1</Caption>
                        <LName>[Time].[Quarter]</LName>
                        <LNum>1</LNum>
                        <DisplayInfo>131075</DisplayInfo>
                    </Member>
                </Tuple>
                <Tuple>
                    <Member Hierarchy="Store">
                        <UName>[Store].[All Stores].[USA].[CA]</UName>
                        <Caption>CA</Caption>
                        <LName>[Store].[Store State]</LName>
                        <LNum>2</LNum>
                        <DisplayInfo>131077</DisplayInfo>
                    </Member>
                    <Member Hierarchy="Time">
                        <UName>[Time].[1997].[Q2]</UName>
                        <Caption>Q2</Caption>
                        <LName>[Time].[Quarter]</LName>
                        <LNum>1</LNum>
                        <DisplayInfo>131075</DisplayInfo>
                    </Member>
                </Tuple>
                <Tuple>
                    <Member Hierarchy="Store">
                        <UName>[Store].[All Stores].[USA].[CA]</UName>
                        <Caption>CA</Caption>
                        <LName>[Store].[Store State]</LName>
                        <LNum>2</LNum>
                        <DisplayInfo>131077</DisplayInfo>
                    </Member>
                    <Member Hierarchy="Time">
                        <UName>[Time].[1997].[Q3]</UName>
                        <Caption>Q3</Caption>
                        <LName>[Time].[Quarter]</LName>
                        <LNum>1</LNum>
                        <DisplayInfo>131075</DisplayInfo>
                    </Member>
                </Tuple>
                <Tuple>
                    <Member Hierarchy="Store">
                        <UName>[Store].[All Stores].[USA].[CA]</UName>
                        <Caption>CA</Caption>
                        <LName>[Store].[Store State]</LName>
                        <LNum>2</LNum>
                        <DisplayInfo>131077</DisplayInfo>
                    </Member>
                    <Member Hierarchy="Time">
                        <UName>[Time].[1997].[Q4]</UName>
                        <Caption>Q4</Caption>
                        <LName>[Time].[Quarter]</LName>
                        <LNum>1</LNum>
                        <DisplayInfo>131075</DisplayInfo>
                    </Member>
                </Tuple>
                <Tuple>
                    <Member Hierarchy="Store">
                        <UName>[Store].[All Stores].[USA].[OR]</UName>
                        <Caption>OR</Caption>
                        <LName>[Store].[Store State]</LName>
                        <LNum>2</LNum>
                        <DisplayInfo>131074</DisplayInfo>
                    </Member>
                    <Member Hierarchy="Time">
                        <UName>[Time].[1997].[Q1]</UName>
                        <Caption>Q1</Caption>
                        <LName>[Time].[Quarter]</LName>
                        <LNum>1</LNum>
                        <DisplayInfo>131075</DisplayInfo>
                    </Member>
                </Tuple>
                <Tuple>
                    <Member Hierarchy="Store">
                        <UName>[Store].[All Stores].[USA].[OR]</UName>
                        <Caption>OR</Caption>
                        <LName>[Store].[Store State]</LName>
                        <LNum>2</LNum>
                        <DisplayInfo>131074</DisplayInfo>
                    </Member>
                    <Member Hierarchy="Time">
                        <UName>[Time].[1997].[Q2]</UName>
                        <Caption>Q2</Caption>
                        <LName>[Time].[Quarter]</LName>
                        <LNum>1</LNum>
                        <DisplayInfo>131075</DisplayInfo>
                    </Member>
                </Tuple>
                <Tuple>
                    <Member Hierarchy="Store">
                        <UName>[Store].[All Stores].[USA].[OR]</UName>
                        <Caption>OR</Caption>
                        <LName>[Store].[Store State]</LName>
                        <LNum>2</LNum>
                        <DisplayInfo>131074</DisplayInfo>
                    </Member>
                    <Member Hierarchy="Time">
                        <UName>[Time].[1997].[Q3]</UName>
                        <Caption>Q3</Caption>
                        <LName>[Time].[Quarter]</LName>
                        <LNum>1</LNum>
                        <DisplayInfo>131075</DisplayInfo>
                    </Member>
                </Tuple>
                <Tuple>
                    <Member Hierarchy="Store">
                        <UName>[Store].[All Stores].[USA].[OR]</UName>
                        <Caption>OR</Caption>
                        <LName>[Store].[Store State]</LName>
                        <LNum>2</LNum>
                        <DisplayInfo>131074</DisplayInfo>
                    </Member>
                    <Member Hierarchy="Time">
                        <UName>[Time].[1997].[Q4]</UName>
                        <Caption>Q4</Caption>
                        <LName>[Time].[Quarter]</LName>
                        <LNum>1</LNum>
                        <DisplayInfo>131075</DisplayInfo>
                    </Member>
                </Tuple>
            </Tuples>
        </Axis>
        <Axis name="SlicerAxis">
            <Tuples>
                <Tuple>
                    <Member Hierarchy="Product">
                        <UName>[Product].[All Products]</UName>
                        <Caption>All Products</Caption>
                        <LName>[Product].[(All)]</LName>
                        <LNum>0</LNum>
                        <DisplayInfo>3</DisplayInfo>
                    </Member>
                    <Member Hierarchy="Promotion Media">
                        <UName>[Promotion Media].[All Media]</UName>
                        <Caption>All Media</Caption>
                        <LName>[Promotion 
                         Media].[(All)]</LName>
                        <LNum>0</LNum>
                        
                        <DisplayInfo>14</DisplayInfo>
                    </Member>
                    <Member Hierarchy="Promotions">
                        <UName>[Promotions].[All Promotions]</UName>
                        <Caption>All Promotions</Caption>
                        <LName>[Promotions].[(All)]</LName>
                        <LNum>0</LNum>
                        <DisplayInfo>51</DisplayInfo>
                    </Member>
                    <Member Hierarchy="Customers">
                        <UName>[Customers].[All Customers]</UName>
                        <Caption>All Customers</Caption>
                        <LName>[Customers].[(All)]</LName>
                        <LNum>0</LNum>
                        <DisplayInfo>3</DisplayInfo>
                    </Member>
                    <Member Hierarchy="Education Level">
                        <UName>[Education Level].[All Education
                         Level]</UName>
                        <Caption>All Education Level</Caption>
                        <LName>[Education Level].[(All)]</LName>
                        <LNum>0</LNum>
                        <DisplayInfo>5</DisplayInfo>
                    </Member>
                    <Member Hierarchy="Gender">
                        <UName>[Gender].[All Gender]</UName>
                        <Caption>All Gender</Caption>
                        <LName>[Gender].[(All)]</LName>
                        <LNum>0</LNum>
                        <DisplayInfo>2</DisplayInfo>
                    </Member>
                    <Member Hierarchy="Marital Status">
                        <UName>[Marital Status].[All Marital
                         Status]</UName>
                        <Caption>All Marital Status</Caption>
                        <LName>[Marital Status].[(All)]</LName>
                        <LNum>0</LNum>
                        <DisplayInfo>2</DisplayInfo>
                    </Member>
                    <Member Hierarchy="Store Size in SQFT">
                        <UName>[Store Size in SQFT].[All Store Size in
                         SQFT]</UName>
                        <Caption>All Store Size in SQFT</Caption>
                        <LName>[Store Size in SQFT].[(All)]</LName>
                        <LNum>0</LNum>
                        <DisplayInfo>21</DisplayInfo>
                    </Member>
                    <Member Hierarchy="Store Type">
                        <UName>[Store Type].[All Store Type]</UName>
                        <Caption>All Store Type</Caption>
                        <LName>[Store Type].[(All)]</LName>
                        <LNum>0</LNum>
                        <DisplayInfo>6</DisplayInfo>
                    </Member>
                    <Member Hierarchy="Yearly Income">
                        <UName>[Yearly Income].[All Yearly Income]</UName>
                        <Caption>All Yearly Income</Caption>
                        <LName>[Yearly Income].[(All)]</LName>
                        <LNum>0</LNum>
                        <DisplayInfo>8</DisplayInfo>
                    </Member>
                </Tuple>
            </Tuples>
        </Axis>
    </Axes>
    <CellData>
        <Cell CellOrdinal="0">
            <Value xsi:type="xsd:double">16890</Value>
            <FmtValue>16,890.00</FmtValue>
        </Cell>
        <Cell CellOrdinal="1">
            <Value xsi:type="xsd:double">14431.0851</Value>
            <FmtValue>14,431.09</FmtValue>
        </Cell>
        <Cell CellOrdinal="2">
            <Value xsi:type="xsd:double">36175.2</Value>
            <FmtValue>$36,175.20</FmtValue>
        </Cell>
        <Cell CellOrdinal="3">
            <Value xsi:type="xsd:int">5498</Value>
            <FmtValue>5498</FmtValue>
        </Cell>
        <Cell CellOrdinal="4">
            <Value xsi:type="xsd:double">18052</Value>
            <FmtValue>18,052.00</FmtValue>
        </Cell>
        <Cell CellOrdinal="5">
            <Value xsi:type="xsd:double">15332.0164</Value>
            <FmtValue>15,332.02</FmtValue>
        </Cell>
        <Cell CellOrdinal="6">
            <Value xsi:type="xsd:double">38396.75</Value>
            <FmtValue>$38,396.75</FmtValue>
        </Cell>
        <Cell CellOrdinal="7">
            <Value xsi:type="xsd:int">5915</Value>
            <FmtValue>5915</FmtValue>
        </Cell>
        <Cell CellOrdinal="8">
            <Value xsi:type="xsd:double">18370</Value>
            <FmtValue>18,370.00</FmtValue>
        </Cell>
        <Cell CellOrdinal="9">
            <Value xsi:type="xsd:double">15672.8256</Value>
            <FmtValue>15,672.83</FmtValue>
        </Cell>
        <Cell CellOrdinal="10">
            <Value xsi:type="xsd:double">39394.05</Value>
            <FmtValue>$39,394.05</FmtValue>
        </Cell>
        <Cell CellOrdinal="11">
            <Value xsi:type="xsd:int">6014</Value>
            <FmtValue>6014</FmtValue>
        </Cell>
        <Cell CellOrdinal="12">
            <Value xsi:type="xsd:double">21436</Value>
            <FmtValue>21,436.00</FmtValue>
        </Cell>
        <Cell CellOrdinal="13">
            <Value xsi:type="xsd:double">18094.498</Value>
            <FmtValue>18,094.50</FmtValue>
        </Cell>
        <Cell CellOrdinal="14">
            <Value xsi:type="xsd:double">45201.84</Value>
            <FmtValue>$45,201.84</FmtValue>
        </Cell>
        <Cell CellOrdinal="15">
            <Value xsi:type="xsd:int">7015</Value>
            <FmtValue>7015</FmtValue>
        </Cell>
        <Cell CellOrdinal="16">
            <Value xsi:type="xsd:double">19287</Value>
            <FmtValue>19,287.00</FmtValue>
        </Cell>
        <Cell CellOrdinal="17">
            <Value xsi:type="xsd:double">16081.0735</Value>
            <FmtValue>16,081.07</FmtValue>
        </Cell>
        <Cell CellOrdinal="18">
            <Value xsi:type="xsd:double">40170.29</Value>
            <FmtValue>$40,170.29</FmtValue>
        </Cell>
        <Cell CellOrdinal="19">
            <Value xsi:type="xsd:int">6184</Value>
            <FmtValue>6184</FmtValue>
        </Cell>
        <Cell CellOrdinal="20">
            <Value xsi:type="xsd:double">15079</Value>
            <FmtValue>15,079.00</FmtValue>
        </Cell>
        <Cell CellOrdinal="21">
            <Value xsi:type="xsd:double">12678.9611</Value>
            <FmtValue>12,678.96</FmtValue>
        </Cell>
        <Cell CellOrdinal="22">
            <Value xsi:type="xsd:double">31772.88</Value>
            <FmtValue>$31,772.88</FmtValue>
        </Cell>
        <Cell CellOrdinal="23">
            <Value xsi:type="xsd:int">4799</Value>
            <FmtValue>4799</FmtValue>
        </Cell>
        <Cell CellOrdinal="24">
            <Value xsi:type="xsd:double">16940</Value>
            <FmtValue>16,940.00</FmtValue>
        </Cell>
        <Cell CellOrdinal="25">
            <Value xsi:type="xsd:double">14273.7838</Value>
            <FmtValue>14,273.78</FmtValue>
        </Cell>
        <Cell CellOrdinal="26">
            <Value xsi:type="xsd:double">35880.46</Value>
            <FmtValue>$35,880.46</FmtValue>
        </Cell>
        <Cell CellOrdinal="27">
            <Value xsi:type="xsd:int">5432</Value>
            <FmtValue>5432</FmtValue>
        </Cell>
        <Cell CellOrdinal="28">
            <Value xsi:type="xsd:double">16353</Value>
            <FmtValue>16,353.00</FmtValue>
        </Cell>
        <Cell CellOrdinal="29">
            <Value xsi:type="xsd:double">13738.6822</Value>
            <FmtValue>13,738.68</FmtValue>
        </Cell>
        <Cell CellOrdinal="30">
            <Value xsi:type="xsd:double">34453.44</Value>
            <FmtValue>$34,453.44</FmtValue>
        </Cell>
        <Cell CellOrdinal="31">
            <Value xsi:type="xsd:int">5196</Value>
            <FmtValue>5196</FmtValue>
        </Cell>
    </CellData>

Dieser Abschnitt enthält Links zu weiteren Informationen zu Technologien, auf die in dieser Spezifikation bezug genommen wird. Die Technologien sind alphabetisch aufgeführt.

Die in diesen Unterlagen enthaltenen Angaben und Daten, einschließlich URLs und anderer Verweise auf Internetwebsites, können ohne vorherige Ankündigung geändert werden. Sofern nicht anders angegeben, sind die hier dargestellten Beispielunternehmen, Organisationen, Produkte, Domänennamen, E-Mail-Adressen, Logos, Personen, Orte und Ereignisse fiktiv, und keine Verbindung mit einem echten Unternehmen, organization, Produkt, Domänenname, E-Mail-Adresse, Logo, Person, Orte oder Ereignis ist beabsichtigt oder sollte abgeleitet werden. Die Benutzer/innen sind verpflichtet, sich an alle anwendbaren Urheberrechtsgesetze zu halten. Unabhängig von der Anwendbarkeit der entsprechenden Urheberrechtsgesetze darf kein Teil dieses Dokuments ohne ausdrückliche schriftliche Erlaubnis der Microsoft Corporation für irgendwelche Zwecke vervielfältigt oder in einem Datenempfangssystem gespeichert oder darin eingelesen werden, unabhängig davon, auf welche Art und Weise oder mit welchen Mitteln (elektronisch, mechanisch, durch Fotokopieren, Aufzeichnen usw.) dies geschieht.

Es ist möglich, dass Microsoft Rechte an Patenten bzw. an angemeldeten Patenten, an Marken, Urheberrechten oder sonstigem geistigen Eigentum besitzt, die sich auf den fachlichen Inhalt dieses Dokuments beziehen. Sofern nicht ausdrücklich in einem schriftlichen Lizenzvertrag von Microsoft vorgesehen, gewährt Ihnen die Bereitstellung dieses Dokuments keine Lizenz für diese Patente, Marken, Urheberrechte oder sonstiges geistiges Eigentum.

© 2001 Microsoft Corporation. Alle Rechte vorbehalten.

Microsoft, Windows, Windows NT, MS-DOS und MSDN sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern.

Die in diesem Dokument erwähnten Namen von Unternehmen und Produkten können Marken der jeweiligen Eigentümer sein.