Freigeben über


Verwenden von geschachtelten FOR XML-Abfragen

Der xml Datentyp und die TYPE-Direktive in FOR XML-Abfragen ermöglichen, dass der von den FOR XML-Abfragen zurückgegebene XML-Code sowohl auf dem Server als auch auf dem Client verarbeitet werden kann.

Verarbeitung mit XML-Typvariablen

Sie können das FOR XML-Abfrageergebnis einer xml Typvariable zuweisen oder XQuery zum Abfragen des Ergebnisses verwenden und dieses Ergebnis einer Typvariable für eine xml weitere 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 @xzurückgegebenen XML-Code auch mithilfe einer der xml Datentypmethoden verarbeiten. Beispielsweise können Sie den Attributwert mithilfe der ProductModelIDValue()-Methode abrufen.

DECLARE @i int;  
SET @i = (SELECT @x.value('/row[1]/@ProductModelID[1]', 'int'));  
SELECT @i;  

Im folgenden Beispiel wird das FOR XML Abfrageergebnis als xml Typ zurückgegeben, da die TYPE Direktive in der FOR XML Klausel angegeben ist.

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 vom xml Typ ist, können Sie eine der xml Datentypmethoden direkt für diesen XML-Code angeben, wie in der folgenden Abfrage dargestellt. In der Abfrage wird die Query()-Methode (xml-Datentyp) verwendet, um das erste <row> untergeordnete Element des <myRoot> Elements 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 internen FOR XML-Abfrageergebnissen an externe Abfragen als XML-Typinstanzen

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. 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 xml-Code hinzugefügt, der vom äußeren FOR XMLObjekt generiert wird.

  • Die innere Abfrage gibt die TYPE Direktive an. Daher sind die von der inneren Abfrage zurückgegebenen XML-Daten vom xml-Typ. Wenn die TYPE-Direktive nicht angegeben ist, wird das Ergebnis der inneren FOR XML Abfrage als nvarchar(max) zurückgegeben, und die XML-Daten werden entitisiert.

Steuern des Shapes der resultierenden XML-Daten

Geschachtelte FOR XML-Abfragen bieten Ihnen mehr Kontrolle beim Definieren der Form der resultierenden XML-Daten. Sie können geschachtelte FOR XML-Abfragen verwenden, um XML zu konstruieren, das teilweise attributorientiert und teilweise elementzentriert ist.

Weitere Informationen zur Spezifikation von attributorientiertem und elementzentriertem XML mit verschachtelten FOR XML-Abfragen finden Sie unter FOR XML Query Compared to Nested FOR XML Query und Shape XML with Nested FOR XML Queries.

Sie können XML-Hierarchien erstellen, die gleichgeordnete Elemente enthalten, indem Sie den geschachtelten AUTO-Modus für XML-Abfragen angeben. Weitere Informationen finden Sie unter Generieren von gleichgeordneten Elementen mit einer geschachtelten AUTO-Modus-Abfrage.

Unabhängig davon, welchen Modus Sie verwenden, bieten geschachtelte FOR XML-Abfragen mehr Kontrolle beim Beschreiben der Form des resultierenden XML. Sie können anstelle von EXPLICIT-Modus-Abfragen verwendet werden.

Beispiele

Die folgenden Themen enthalten Beispiele für geschachtelte FOR XML-Abfragen.

FOR XML-Abfrage im Vergleich zu geschachtelter FOR XML-Abfrage
Vergleicht eine einstufige FOR XML-Abfrage mit einer geschachtelten FOR XML-Abfrage. Dieses Beispiel enthält eine Demonstration, wie sowohl attributorientiertes als auch elementorientiertes XML als Ergebnis der Abfrage angegeben wird.

Generieren von Geschwistern mit einer geschachtelten AUTO Mode-Abfrage
Zeigt, wie Geschwister mithilfe einer geschachtelten AUTO-Modus-Abfrage generiert werden.

Verwenden von geschachtelten FOR XML-Abfragen in ASP.NET
Veranschaulicht, wie eine ASPX-Anwendung FOR XML verwenden kann, um XML von SQL Server zurückzugeben.

Shape-XML mit geschachtelten FOR XML-Abfragen
Zeigt, wie geschachtelte FOR XML-Abfragen verwendet werden, um die Struktur eines von SQL Server erstellten XML-Dokuments zu steuern.