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.
Wie in FOR XML (SQL Server) beschrieben, gibt der AUTO-Modus Abfrageergebnisse als geschachtelte XML-Elemente zurück. Dies bietet nicht viel Kontrolle über das Shape des XML-Codes, das aus einem Abfrageergebnis generiert wurde. Die AUTO-Modus-Abfragen sind nützlich, wenn Sie einfache Hierarchien generieren möchten. Verwenden Sie jedoch den EXPLIZITEN Modus mit FOR XML und den PATH-Modus mit FOR XML, um mehr Kontrolle und Flexibilität bei der Gestaltung der XML-Struktur aus einem Abfrageergebnis zu ermöglichen.
Jede Tabelle in der FROM-Klausel, aus der mindestens eine Spalte in der SELECT-Klausel aufgeführt ist, wird als XML-Element dargestellt. Die in der SELECT-Klausel aufgeführten Spalten werden Attributen oder Unterelementen zugeordnet, wenn die optionale ELEMENTS-Option in der FOR XML-Klausel angegeben ist.
Die XML-Hierarchie, die Schachtelung der Elemente, in der resultierenden XML basiert auf der Reihenfolge der Tabellen, die durch die in der SELECT-Klausel angegebenen Spalten identifiziert werden. Daher ist die Reihenfolge, in der Spaltennamen in der SELECT-Klausel angegeben werden, von Bedeutung. Die erste, ganz links stehende Tabelle, die identifiziert wird, bildet das oberste Element im resultierenden XML-Dokument. Die zweite linke Tabelle, die durch Spalten in der SELECT-Anweisung identifiziert wird, bildet ein Unterelement innerhalb des oberen Elements usw.
Wenn ein in der SELECT-Klausel aufgelisteter Spaltenname aus einer Tabelle stammt, die bereits durch eine zuvor angegebene Spalte in der SELECT-Klausel identifiziert wurde, wird die Spalte als Attribut des bereits erstellten Elements hinzugefügt, anstatt eine neue Hierarchieebene zu öffnen. Wenn die OPTION ELEMENTE angegeben ist, wird die Spalte als Attribut hinzugefügt.
Führen Sie z. B. diese Abfrage aus:
SELECT Cust.CustomerID,
OrderHeader.CustomerID,
OrderHeader.SalesOrderID,
OrderHeader.Status,
Cust.CustomerType
FROM Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader
WHERE Cust.CustomerID = OrderHeader.CustomerID
ORDER BY Cust.CustomerID
FOR XML AUTO
Dies ist das Teilergebnis:
<Cust CustomerID="1" CustomerType="S">
<OrderHeader CustomerID="1" SalesOrderID="43860" Status="5" />
<OrderHeader CustomerID="1" SalesOrderID="44501" Status="5" />
<OrderHeader CustomerID="1" SalesOrderID="45283" Status="5" />
<OrderHeader CustomerID="1" SalesOrderID="46042" Status="5" />
</Cust>
...
Beachten Sie Folgendes in der SELECT-Klausel:
Die CustomerID verweist auf die Cust-Tabelle. Daher wird ein <
Cust> Element erstellt, und CustomerID wird als Attribut hinzugefügt.Als Nächstes verweisen drei Spalten, OrderHeader.CustomerID, OrderHeader.SaleOrderID und OrderHeader.Status, auf die Tabelle "OrderHeader". Daher wird ein <>
OrderHeaderElement als Unterelement desCust<> Elements hinzugefügt, und die drei Spalten werden als Attribute <OrderHeader>hinzugefügt.Als Nächstes verweist die Spalte "Cust.CustomerType" erneut auf die Cust-Tabelle, die bereits in der Spalte "Cust.CustomerID" identifiziert wurde. Daher wird kein neues Element erstellt. Stattdessen wird das CustomerType-Attribut dem <
Cust> Zuvor erstellten Element hinzugefügt.Die Abfrage gibt Aliase für die Tabellennamen an. Diese Aliase werden als entsprechende Elementnamen angezeigt.
ORDER BY ist erforderlich, um alle untergeordneten Elemente unter einem übergeordneten Element zu gruppieren.
Diese Abfrage ähnelt dem vorherigen, mit der Ausnahme, dass die SELECT-Klausel Spalten in der Tabelle OrderHeader vor den Spalten in der Cust-Tabelle angibt. Daher wird das erste <OrderHeader> Element erstellt und anschließend das <Cust> untergeordnete Element hinzugefügt.
select OrderHeader.CustomerID,
OrderHeader.SalesOrderID,
OrderHeader.Status,
Cust.CustomerID,
Cust.CustomerType
from Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader
where Cust.CustomerID = OrderHeader.CustomerID
for xml auto
Dies ist das Teilergebnis:
<OrderHeader CustomerID="1" SalesOrderID="43860" Status="5">
<Cust CustomerID="1" CustomerType="S" />
</OrderHeader>
...
Wenn die OPTION ELEMENTS in der FOR XML-Klausel hinzugefügt wird, wird elementorientiertes XML zurückgegeben.
SELECT Cust.CustomerID,
OrderHeader.CustomerID,
OrderHeader.SalesOrderID,
OrderHeader.Status,
Cust.CustomerType
FROM Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader
WHERE Cust.CustomerID = OrderHeader.CustomerID
ORDER BY Cust.CustomerID
FOR XML AUTO, ELEMENTS
Dies ist das Teilergebnis:
<Cust>
<CustomerID>1</CustomerID>
<CustomerType>S</CustomerType>
<OrderHeader>
<CustomerID>1</CustomerID>
<SalesOrderID>43860</SalesOrderID>
<Status>5</Status>
</OrderHeader>
...
</Cust>
...
In dieser Abfrage werden die CustomerID-Werte von einer Zeile zum nächsten beim Erstellen der <Cust-Elemente> verglichen, da CustomerID der Primärschlüssel der Tabelle ist. Wenn CustomerID nicht als Primärschlüssel für die Tabelle identifiziert wird, werden alle Spaltenwerte (CustomerID, CustomerType in dieser Abfrage) von einer Zeile zur nächsten verglichen. Wenn sich die Werte unterscheiden, wird dem XML-Code ein neues <Cust-Element> hinzugefügt.
Wenn beim Vergleichen dieser Spaltenwerte eine der zu vergleichenden Spalten den Typ "Text", "ntext", " Image" oder "XML" aufweist, geht FOR XML davon aus, dass sich die Werte unterscheiden und nicht verglichen werden, auch wenn sie möglicherweise identisch sind. Dies liegt daran, dass das Vergleichen großer Objekte nicht unterstützt wird. Elemente werden dem Ergebnis für jede ausgewählte Zeile hinzugefügt. Beachten Sie, dass Spalten von (n)varchar(max) und varbinary(max) verglichen werden.
Wenn eine Spalte in der SELECT-Klausel keiner der in der FROM-Klausel identifizierten Tabellen zugeordnet werden kann, wie bei einer Aggregatspalte oder berechneten Spalte, wird die Spalte im XML-Dokument in der tiefsten Schachtelungsebene hinzugefügt, wenn sie in der Liste gefunden wird. Wenn eine solche Spalte als erste Spalte in der SELECT-Klausel angezeigt wird, wird die Spalte dem obersten Element hinzugefügt.
Wenn das Sternchen (*) Platzhalterzeichen in der SELECT-Klausel angegeben ist, wird die Verschachtelung auf dieselbe Weise wie zuvor beschrieben bestimmt, basierend auf der Reihenfolge, in der die Zeilen von der Abfrage-Engine zurückgegeben werden.
In diesem Abschnitt
Die folgenden Themen enthalten weitere Informationen zum AUTO-Modus: