Anmerkung
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen, dich anzumelden oder die Verzeichnisse zu wechseln.
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen , die Verzeichnisse zu wechseln.
Gilt für:SQL Server
Azure SQL-Datenbank
Verwaltete Azure SQL-Instanz
SQL-Datenbank in Microsoft Fabric
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,SalesPersonIDundOrderDate.AdventureWorks2025speichert 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ürSalesPersonIDbereit. 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
SalesOrderab, 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,SalesPersonIDundCustomerIDabruft, 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ürXmlColan, 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);