Verwenden von geschachtelten FOR XML-Abfragen
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance
Der xml -Datentyp und die TYPE-Direktive in FOR XML-Abfragen ermöglichen, dass der von FOR XML-Abfragen zurückgegebene XML-Code sowohl auf dem Server als auch auf dem Client verarbeitet werden kann.
Verarbeiten mit xml-Typvariablen
Sie können das Ergebnis einer FOR XML-Abfrage einer xml -Typvariablen zuweisen oder das Ergebnis mithilfe einer XQuery-Abfrage abfragen und das daraus entstehende Ergebnis einer xml -Typvariablen zur weiteren Verarbeitung zuweisen.
DECLARE @x xml
SET @x=(SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, TYPE)
SELECT @x
-- Result
--<row ProductModelID="122" Name="All-Purpose Bike Stand" />
--<row ProductModelID="119" Name="Bike Wash" />
Sie können den in der Variablen @x
zurückgegebenen XML-Code zusätzlich verarbeiten, indem Sie eine der xml -Datentypmethoden verwenden. So können Sie z. B. den Attributwert von ProductModelID
mithilfe der value()-Methodeabrufen.
DECLARE @i int;
SET @i = (SELECT @x.value('/row[1]/@ProductModelID[1]', 'int'));
SELECT @i;
Im folgenden Beispiel wird das Ergebnis der FOR XML
-Abfrage als xml -Typ zurückgegeben, da in der TYPE
-Klausel die FOR XML
-Direktive angegeben wurde.
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=119 or ProductModelID=122
FOR XML RAW, TYPE,ROOT('myRoot');
Dies ist das Ergebnis:
<myRoot>
<row ProductModelID="122" Name="All-Purpose Bike Stand" />
<row ProductModelID="119" Name="Bike Wash" />
</myRoot>
Da das Ergebnis dem xml -Typ entspricht, können Sie eine der xml -Datentypmethoden direkt für diesen XML-Code angeben, wie es in der folgenden Abfrage gezeigt wird. In der Abfrage wird die query()-Methode (xml-Datentyp) verwendet, um das erste untergeordnete <row>
-Element des Elements <myRoot>
abzurufen.
SELECT (SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=119 or ProductModelID=122
FOR XML RAW, TYPE,ROOT('myRoot')).query('/myRoot[1]/row[1]');
Dies ist das Ergebnis:
<row ProductModelID="122" Name="All-Purpose Bike Stand" />
Zurückgeben von Ergebnissen innerer FOR XML-Abfragen als xml-Typinstanzen an äußere Abfragen
Sie können geschachtelte FOR XML
-Abfragen schreiben, bei denen das Ergebnis der inneren Abfrage als xml -Typ an die äußere Abfrage zurückgegeben wird. Zum Beispiel:
SELECT Col1,
Col2,
( SELECT Col3, Col4
FROM T2
WHERE T2.Col = T1.Col
...
FOR XML AUTO, TYPE )
FROM T1
WHERE ...
FOR XML AUTO, TYPE;
Beachten Sie hinsichtlich der vorherigen Abfrage Folgendes:
Der von der inneren
FOR XML
-Abfrage generierte XML-Code wird dem von der äußerenFOR XML
-Abfrage generierten XML-Code hinzugefügt.Die innere Abfrage gibt die
TYPE
-Direktive an. Die von der inneren Abfrage zurückgegebenen XML-Daten gehören daher dem xml -Typ an. Wenn die TYPE-Direktive nicht angegeben wird, wird als Ergebnis der innerenFOR XML
-Abfrage nvarchar(max) zurückgegeben, und die XML-Daten werden in Entitäten geändert.
Steuern der Form der resultierenden XML-Daten
Geschachtelte FOR XML-Abfragen ermöglichen eine bessere Steuerung der Form der resultierenden XML-Daten. Sie können jedoch mit geschachtelten FOR XML-Abfragen XML-Code erstellen, der zum Teil attributzentriert und zum Teil elementzentriert ist.
Weitere Informationen über das Angeben von attributzentrierter und elementzentrierter XML mit geschachtelten FOR XML-Abfragen finden Sie unter FOR XML-Abfragen im Vergleich zu geschachtelten FOR XML-Abfragen und Gestalten von XML mit geschachtelten FOR XML-Abfragen.
Sie können XML-Hierarchien generieren, die gleichgeordnete Elemente enthalten, indem Sie geschachtelte FOR XML-Abfragen im AUTO-Modus angeben. Weitere Informationen finden Sie unter Generieren von gleichgeordneten Elementen mit einer geschachtelten AUTO-Modusabfrage.
Unabhängig davon, welchen Modus Sie verwenden, bieten geschachtelte FOR XML-Abfragen größere Steuerungsmöglichkeiten beim Beschreiben der Form des resultierenden XML-Codes. Diese Abfragen können anstelle von Abfragen im EXPLICIT-Modus verwendet werden.
Beispiele
Die folgenden Themen enthalten Beispiele für geschachtelte FOR XML-Abfragen.
FOR XML-Abfragen im Vergleich zu geschachtelten FOR XML-Abfragen
In diesem Thema wird eine einstufige FOR XML-Abfrage mit einer geschachtelten FOR XML-Abfrage verglichen. In diesem Beispiel wird unter Anderem veranschaulicht, wie sowohl attributzentriertes als auch elementzentriertes XML als Abfrageergebnis angegeben wird.Generieren von gleichgeordneten Elementen mit einer geschachtelten AUTO-Modusabfrage
Zeigt, wie gleichgeordnete Elemente durch Verwenden einer geschachtelten Abfrage im AUTO-Modus generiert werden.Verwenden geschachtelter FOR XML-Abfragen in ASP.NET
Veranschaulicht, wie eine ASPX-Anwendung FOR XML verwenden kann, um XML von SQL Server zurückzugeben.Gestalten von XML mit geschachtelten FOR XML-Abfragen
Zeigt, wie mit geschachtelten FOR XML-Abfragen die Struktur eines von SQL Server erstellten XML-Dokuments gesteuert werden kann.