Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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, undOrderDate. AdventureWorks2012 speichert diese Informationen in derSalesOrderHeaderTabelle.Details zum Verkaufsauftrag. Dazu gehören mindestens ein bestelltes Produkt, der Einzelpreis und die bestellte Menge. Diese Informationen werden in der
SalesOrderDetailTabelle gespeichert.Informationen zu Vertriebsmitarbeitern. Dies ist der Verkäufer, der die Bestellung übernommen hat. Die
SalesPersonTabelle bietet dieSalesPersonID. Für diese Abfrage müssen Sie diese Tabelle mit derEmployeeTabelle 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
SalesOrderRowset ab, das in derFROMKlausel angegeben ist. Das Ergebnis ist ein XML mit einem oder <SalesOrder> mehreren Elementen.Gibt
AUTOden Modus und die DirektiveTYPEan.AUTOModus wandelt das Abfrageergebnis in XML um, und dieTYPEAnweisung gibt das Ergebnis alsxmlTyp zurück.Enthält zwei geschachtelte
SELECTAnweisungen, die durch ein Komma getrennt sind. Die erste geschachtelteSELECTRuft Verkaufsauftragsinformationen, Kopfzeilen und Details ab, und die zweite geschachtelteSELECTAnweisung ruft Vertriebsmitarbeiterinformationen ab.- Die
SELECTAnweisung, dieSalesOrderID,SalesPersonID, undCustomerIDabruft, enthält selbst eine weitere geschachtelteSELECT ... FOR XMLAnweisung (mitAUTOModus undTYPEDirektive), die Details zu Verkaufsaufträgen zurückgibt.
- Die
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
FROMKlausel hinzugefügt. Das Abfrageergebnis wird als Tabelle zurückgegeben. Notieren Sie sich den Alias, derXmlColhinzugefügt wird.Die
SELECT-Klausel spezifiziert eine XQuery für das, was in derFROM-Klausel unterXmlColzurückgegeben wird. Diequery()Methode desxmlDatentyps 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)