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.
Gilt für: SQL Server
Azure SQL-Datenbank
Azure SQL Managed Instance
Im folgenden Beispiel wird das Generieren von gleichgeordneten Elementen durch Verwenden einer geschachtelten Abfrage im AUTO-Modus dargestellt. 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. Hierzu gehören folgende Elemente:
Auftragskopfzeileninformationen,
SalesOrderID
,SalesPersonID
undOrderDate
.AdventureWorks2022
speichert diese Informationen in derSalesOrderHeader
-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
SalesPerson
-Tabelle stellt die Angaben fürSalesPersonID
bereit. Für diese Abfrage müssen Sie diese Tabelle mit derEmployee
-Tabelle verknüpfen, um den Namen des Vertriebsmitarbeiters zu finden.
Die beiden folgenden unterschiedlichen SELECT
-Abfragen generieren XML-Code, der in seiner Form einen kleinen Unterschied aufweist.
Die erste Abfrage generiert XML-Code, in dem <SalesPerson>
und <SalesOrderHeader>
als gleichgeordnete Unterelemente von <SalesOrder>
erscheinen:
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 bewirkt die äußerste SELECT
-Anweisung Folgendes:
Sie fragt das Rowset
SalesOrder
ab, das in derFROM
-Klausel angegeben ist. Das Ergebnis ist ein XML-Code mit einem oder mehreren<SalesOrder>
-Elementen.Gibt den
AUTO
-Modus und dieTYPE
-Direktive an.AUTO
-Modus wird das Abfrageergebnis in XML umgewandelt, und von derTYPE
-Direktive wird das Ergebnis als xml -Typ zurückgegeben.Sie schließt zwei geschachtelte
SELECT
-Anweisungen ein, die durch ein Komma voneinander getrennt sind. Die erste geschachtelteSELECT
-Anweisung ruft die Bestellinformationen (Kopfzeile und Details) ab, und die zweite geschachtelteSELECT
-Anweisung ruft die Informationen zum Vertriebsmitarbeiter ab.- Die
SELECT
-Anweisung, dieSalesOrderID
,SalesPersonID
undCustomerID
abruft, enthält eine weitere geschachtelteSELECT ... FOR XML
-Anweisung (mitAUTO
-Modus undTYPE
-Direktive), die Detailinformationen zur Bestellung zurückgibt.
- Die
Die SELECT
-Anweisung, mit der die Informationen zum Vertriebsmitarbeiter abgerufen werden, fragt ein Rowset ( SalesPerson
) ab, das in der FROM
-Klausel erstellt wird. Damit FOR XML
-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="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 Bestellinformationen, außer dass im resultierenden XML-Code das <SalesPerson>
-Element als gleichgeordnetes Element von <SalesOrderDetail>
erscheint:
<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 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ügtenXmlCol
-Alias.Die
SELECT
-Klausel gibt eine XQuery-Abfrage fürXmlCol
an, das in derFROM
-Klausel zurückgegeben wird. Die XQuery-Abfrage wird mit derquery()
-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), (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);