Freigeben über


Generieren von gleichgeordneten Elementen durch Verwenden einer geschachtelten Abfrage im AUTO-Modus

Im folgenden Beispiel wird das Generieren von gleichgeordneten Elementen durch Verwenden einer geschachtelten Abfrage im AUTO-Modus gezeigt. Die einzige Möglichkeit zum Generieren von derartigem XML-Code besteht im Verwenden des EXPLICIT-Modus. Dies kann jedoch sehr aufwändig sein.

Beispiel

Diese Abfrage konstruiert XML-Code, der Bestellinformationen bereitstellt. Dazu gehören:

  • Kopfzeileninformationen der Bestellungen, die Bestellungs-ID (SalesOrderID), die Vertriebsmitarbeiter-ID (SalesPersonID) und das Bestelldatum (OrderDate). AdventureWorks2008R2 speichert diese Informationen in der SalesOrderHeader-Tabelle.

  • Detaillierte Bestellinformationen. Dazu gehören Angaben zu einem oder mehreren bestellten Produkten, zum Einzelpreis und zur bestellten Menge. Diese Informationen werden in der SalesOrderDetail-Tabelle gespeichert.

  • Informationen zum Vertriebsmitarbeiter. Dies ist der Vertriebsmitarbeiter, der die Bestellung entgegengenommen hat.

Die beiden folgenden unterschiedlichen Abfragen generieren XML-Code, der in seiner Form einen kleinen Unterschied aufweist.

Die erste Abfrage generiert XML-Code, in dem <SalesOrderHeader> als nebengeordnete Unterelemente von <SalesOrder> erscheinen:

USE AdventureWorks2008R2;
GO
SELECT 
      (SELECT TOP 2 SalesOrderID, SalesPersonID, CustomerID,
         (SELECT TOP 3 SalesOrderID, ProductID, OrderQty, UnitPrice
           FROM Sales.SalesOrderDetail
            WHERE  SalesOrderDetail.SalesOrderID = 
                   SalesOrderHeader.SalesOrderID
            FOR XML AUTO, TYPE)
        FROM  Sales.SalesOrderHeader
        WHERE SalesOrderHeader.SalesOrderID = SalesOrder.SalesOrderID
        FOR XML AUTO, TYPE)
FROM (SELECT SalesOrderHeader.SalesOrderID, SalesOrderHeader.SalesPersonID
      FROM Sales.SalesOrderHeader, Sales.SalesPerson
      WHERE SalesOrderHeader.SalesPersonID = SalesPerson.BusinessEntityID
     ) AS SalesOrder
ORDER BY SalesOrder.SalesOrderID
FOR XML AUTO, TYPE;

In der vorherigen Abfrage bewirkt die äußerste SELECT-Anweisung Folgendes:

  • Sie fragt das Rowset SalesOrder ab, das in der FROM-Klausel angegeben ist. Das Ergebnis ist ein XML-Code mit einem oder mehreren <SalesOrder>-Elementen.

  • Sie gibt den AUTO-Modus und die TYPE-Direktive an. Der AUTO-Modus wandelt das Abfrageergebnis in XML-Code um, und die TYPE-Direktive gibt das Ergebnis als xml-Typ zurück.

  • Sie schließt zwei geschachtelte SELECT-Anweisungen ein, die durch ein Komma voneinander getrennt sind. Die erste geschachtelte SELECT-Anweisung ruft die Bestellinformationen (Kopfzeile und Details) ab, und die zweite geschachtelte SELECT-Anweisung ruft die Informationen zum Vertriebsmitarbeiter ab.

    • Die SELECT-Anweisung, die SalesOrderID, SalesPersonID und CustomerID abruft, enthält eine weitere geschachtelte SELECT ... FOR XML-Anweisung (mit AUTO-Modus und TYPE-Direktive), die Detailinformationen zur Bestellung zurückgibt.

Die SELECT-Anweisung, mit der die Informationen zum Vertriebsmitarbeiter abgerufen werden, fragt ein Rowset (SalesPerson) ab, das in der FROM-Klausel erstellt wird. Damit F-Abfragen funktionsfähig sind, müssen Sie einen Namen für das anonyme Rowset bereitstellen, das in der FROM-Klausel generiert wird. In diesem Fall ist der bereitgestellte Name SalesPerson.

Dies ist das Teilergebnis:

<SalesOrder>

<Sales.SalesOrderHeader SalesOrderID="43659" SalesPersonID="279" CustomerID="29825">

<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="776" OrderQty="1" UnitPrice="2024.9940" />

<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="777" OrderQty="3" UnitPrice="2024.9940" />

<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="778" OrderQty="1" UnitPrice="2024.9940" />

</Sales.SalesOrderHeader>

</SalesOrder>

<SalesOrder>

<Sales.SalesOrderHeader SalesOrderID="43660" SalesPersonID="279" CustomerID="29672">

<Sales.SalesOrderDetail SalesOrderID="43660" ProductID="762" OrderQty="1" UnitPrice="419.4589" />

<Sales.SalesOrderDetail SalesOrderID="43660" ProductID="758" OrderQty="1" UnitPrice="874.7940" />

</Sales.SalesOrderHeader>

</SalesOrder>

...

Die folgende Abfrage generiert dieselben Bestellinformationen, außer dass im resultierenden XML-Code das <SalesPerson>-Element als nebengeordnetes Element von <SalesOrderDetail> erscheint:

<SalesOrder>

<SalesOrderHeader ...>

<SalesOrderDetail .../>

<SalesOrderDetail .../>

...

<SalesPerson .../>

</SalesOrderHeader>

</SalesOrder>

<SalesOrder>

...

</SalesOrder>

Im Folgenden wird die Abfrage aufgeführt:

USE AdventureWorks2008R2;
GO
SELECT SalesOrderID, SalesPersonID, CustomerID,
             (SELECT TOP 3 SalesOrderID, ProductID, OrderQty, UnitPrice
              FROM Sales.SalesOrderDetail
              WHERE SalesOrderDetail.SalesOrderID = SalesOrderHeader.SalesOrderID
              FOR XML AUTO, TYPE)
FROM Sales.SalesOrderHeader
WHERE SalesOrderID=43659 OR SalesOrderID=43660
FOR XML AUTO, TYPE;

Dies ist das Ergebnis:

<Sales.SalesOrderHeader SalesOrderID="43659" SalesPersonID="279" CustomerID="29825">

<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="776" OrderQty="1" UnitPrice="2024.9940" />

<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="777" OrderQty="3" UnitPrice="2024.9940" />

<Sales.SalesOrderDetail SalesOrderID="43659" ProductID="778" OrderQty="1" UnitPrice="2024.9940" />

</Sales.SalesOrderHeader>

<Sales.SalesOrderHeader SalesOrderID="43660" SalesPersonID="279" CustomerID="29672">

<Sales.SalesOrderDetail SalesOrderID="43660" ProductID="762" OrderQty="1" UnitPrice="419.4589" />

<Sales.SalesOrderDetail SalesOrderID="43660" ProductID="758" OrderQty="1" UnitPrice="874.7940" />

</Sales.SalesOrderHeader>

Da die TYPE-Direktive Abfrageergebnisse als xml-Typ zurückgibt, können Sie den resultierenden XML-Code mithilfe verschiedener xml-Datentypmethoden abfragen. Weitere Informationen finden Sie unter XML-Datentypmethoden. Beachten Sie in der nächsten Abfrage Folgendes:

  • Die vorherige Abfrage wird in der FROM-Klausel hinzugefügt. Das Abfrageergebnis wird als Tabelle zurückgegeben. Beachten Sie den hinzugefügten XmlCol-Alias.

  • Die SELECT-Klausel gibt eine XQuery-Abfrage für XmlCol an, das in der FROM-Klausel zurückgegeben wird. Die XQuery-Abfrage wird mit der query()-Methode des xml-Datentyps angegeben. Weitere Informationen finden Sie unter query()-Methode (xml-Datentyp).

    SELECT XmlCol.query('<Root> { /* } </Root>')
    FROM (
    SELECT SalesOrderID, SalesPersonID, CustomerID,
                 (SELECT TOP 3 SalesOrderID, ProductID, OrderQty, UnitPrice
                  FROM Sales.SalesOrderDetail
                  WHERE SalesOrderDetail.SalesOrderID = SalesOrderHeader.SalesOrderID
                  FOR XML AUTO, TYPE)
    FROM Sales.SalesOrderHeader
    WHERE SalesOrderID='43659' or SalesOrderID='43660'
    FOR XML AUTO, TYPE ) as T(XmlCol);
    

Siehe auch

Verweis