Freigeben über


Generieren von gleichgeordneten Elementen mit einer geschachtelten Abfrage im AUTO-Modus

Das folgende Beispiel zeigt, wie gleichgeordnete Elemente mithilfe einer geschachtelten AUTO-Modus-Abfrage generiert werden. Die einzige andere Möglichkeit zum Generieren solcher XML-Daten besteht darin, den EXPLICIT-Modus zu verwenden. Dies kann jedoch umständlich sein.

Beispiel

Diese Abfrage erstellt XML, die Verkaufsauftragsinformationen bereitstellt. Hierzu gehören folgende Elemente:

  • Informationen zur Kopfzeile des Verkaufsauftrags, SalesOrderID, SalesPersonID, und OrderDate. AdventureWorks2012 speichert diese Informationen in der SalesOrderHeader Tabelle.

  • Details zum Verkaufsauftrag. Dazu gehören mindestens ein bestelltes Produkt, der Einzelpreis und die bestellte Menge. Diese Informationen werden in der SalesOrderDetail Tabelle gespeichert.

  • Informationen zu Vertriebsmitarbeitern. Dies ist der Verkäufer, der die Bestellung übernommen hat. Die SalesPerson Tabelle bietet die SalesPersonID. Für diese Abfrage müssen Sie diese Tabelle mit der Employee Tabelle verbinden, um den Namen der Vertriebsperson zu finden.

Die beiden unterschiedlichen SELECT Abfragen erzeugen XML mit einem kleinen Unterschied in der Form.

Die erste Abfrage generiert XML, in dem <SalesPerson> und <SalesOrderHeader> als gleichgeordnete untergeordnete Elemente von <SalesOrder> angezeigt werden.

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),  
        (SELECT *   
         FROM  (SELECT SalesPersonID, EmployeeID  
              FROM Sales.SalesPerson, HumanResources.Employee  
              WHERE SalesPerson.SalesPersonID = Employee.EmployeeID) As   
                     SalesPerson  
         WHERE  SalesPerson.SalesPersonID = SalesOrder.SalesPersonID  
       FOR XML AUTO, TYPE)  
FROM (SELECT SalesOrderHeader.SalesOrderID, SalesOrderHeader.SalesPersonID  
      FROM Sales.SalesOrderHeader, Sales.SalesPerson  
      WHERE SalesOrderHeader.SalesPersonID = SalesPerson.SalesPersonID  
     ) as SalesOrder  
ORDER BY SalesOrder.SalesOrderID  
FOR XML AUTO, TYPE  

In der vorherigen Abfrage führt die äußerste Anweisung SELECT Folgendes aus:

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

  • GibtAUTO den Modus und die DirektiveTYPE an. AUTO Modus wandelt das Abfrageergebnis in XML um, und die TYPE Anweisung gibt das Ergebnis als xml Typ zurück.

  • Enthält zwei geschachtelte SELECT Anweisungen, die durch ein Komma getrennt sind. Die erste geschachtelte SELECT Ruft Verkaufsauftragsinformationen, Kopfzeilen und Details ab, und die zweite geschachtelte SELECT Anweisung ruft Vertriebsmitarbeiterinformationen ab.

    • Die SELECT Anweisung, die SalesOrderID, SalesPersonID, und CustomerID abruft, enthält selbst eine weitere geschachtelte SELECT ... FOR XML Anweisung (mit AUTO Modus und TYPE Direktive), die Details zu Verkaufsaufträgen zurückgibt.

Die SELECT Anweisung, die die Vertriebsmitarbeiterinformationen abruft, fragt ein Rowset ab, SalesPersondas in der FROM Klausel erstellt wurde. Damit FOR XML Abfragen funktionieren, müssen Sie einen Namen für das in der FROM Klausel generierte anonyme Rowset angeben. In diesem Fall ist der angegebene Name SalesPerson.

Dies ist das Teilergebnis:

<SalesOrder>  
  <Sales.SalesOrderHeader SalesOrderID="43659" SalesPersonID="279" CustomerID="676">  
    <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>  
  <SalesPerson SalesPersonID="279" EmployeeID="279" />  
</SalesOrder>  
...  

Die folgende Abfrage generiert dieselben Verkaufsauftragsinformationen, mit der Ausnahme, dass in der resultierenden XML die <SalesPerson> angezeigt wird als gleichgeordnetes Element von :<SalesOrderDetail>

<SalesOrder>  
    <SalesOrderHeader ...>  
          <SalesOrderDetail .../>  
          <SalesOrderDetail .../>  
          ...  
          <SalesPerson .../>  
    </SalesOrderHeader>  
  
</SalesOrder>  
<SalesOrder>  
  ...  
</SalesOrder>  

Im Folgenden wird die Abfrage aufgeführt:

SELECT SalesOrderID, SalesPersonID, CustomerID,  
             (select top 3 SalesOrderID, ProductID, OrderQty, UnitPrice  
              from Sales.SalesOrderDetail  
              WHERE SalesOrderDetail.SalesOrderID = SalesOrderHeader.SalesOrderID  
              FOR XML AUTO, TYPE),  
              (SELECT *   
               FROM  (SELECT SalesPersonID, EmployeeID  
                    FROM Sales.SalesPerson, HumanResources.Employee  
                    WHERE SalesPerson.SalesPersonID = Employee.EmployeeID) As SalesPerson  
               WHERE  SalesPerson.SalesPersonID = SalesOrderHeader.SalesPersonID  
         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="676">  
  <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" />  
  <SalesPerson SalesPersonID="279" EmployeeID="279" />  
</Sales.SalesOrderHeader>  
<Sales.SalesOrderHeader SalesOrderID="43660" SalesPersonID="279" CustomerID="117">  
  <Sales.SalesOrderDetail SalesOrderID="43660" ProductID="762" OrderQty="1" UnitPrice="419.4589" />  
  <Sales.SalesOrderDetail SalesOrderID="43660" ProductID="758" OrderQty="1" UnitPrice="874.7940" />  
  <SalesPerson SalesPersonID="279" EmployeeID="279" />  
</Sales.SalesOrderHeader>  

Da die TYPE Direktive ein Abfrageergebnis als xml Typ zurückgibt, können Sie das resultierende XML mithilfe verschiedener xml Datentypmethoden abfragen. Weitere Informationen finden Sie unter XML-Datentypmethoden. Beachten Sie in der folgenden Abfrage Folgendes:

  • Die vorherige Abfrage wird in der FROM Klausel hinzugefügt. Das Abfrageergebnis wird als Tabelle zurückgegeben. Notieren Sie sich den Alias, der XmlCol hinzugefügt wird.

  • Die SELECT-Klausel spezifiziert eine XQuery für das, was in der FROM-Klausel unter XmlCol zurückgegeben wird. Die query() Methode des xml Datentyps wird zum Angeben der XQuery verwendet. Weitere Informationen finden Sie unter "query() Method (xml Data Type)".

    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),  
                  (SELECT *   
                   FROM  (SELECT SalesPersonID, EmployeeID  
                        FROM Sales.SalesPerson, HumanResources.Employee  
                        WHERE SalesPerson.SalesPersonID = Employee.EmployeeID) As SalesPerson  
                   WHERE  SalesPerson.SalesPersonID = SalesOrderHeader.SalesPersonID  
             FOR XML AUTO, TYPE)  
    FROM Sales.SalesOrderHeader  
    WHERE SalesOrderID='43659' or SalesOrderID='43660'  
    FOR XML AUTO, TYPE ) as T(XmlCol)  
    

Siehe auch

Verwenden von geschachtelten FOR XML-Abfragen