Geschachtelte FOR XML-Abfragen

In SQL Server 2000 kann die FOR XML-Klausel nur auf der obersten Ebene einer SELECT-Abfrage angegeben werden. Der resultierende XML-Code wird in erster Linie an den Client zur weiteren Verarbeitung zurückgegeben. Ab SQL Server 2005 ermöglichen der xml-Datentyp und die TYPE-Direktive in FOR XML-Abfragen, dass der von FOR XML-Abfragen zurückgegebene XML-Code, auf dem Server zusätzlich verarbeitet wird.

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()-Methode abrufen.

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 FOR XML-Klausel die TYPE-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 Methode query() (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. 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ßeren FOR 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 das Ergebnis der inneren FOR XML-Abfrage als 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. In SQL Server 2000 generieren im RAW- und AUTO-Modus ausgeführte Abfragen standardmäßig attributzentrierten XML-Code. Beispiel:

SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW
 

Dies ist das attributzentrierte Ergebnis:

<row ProductModelID="122" Name="All-Purpose Bike Stand" />
<row ProductModelID="119" Name="Bike Wash" />

Stattdessen können Sie durch Angeben der ELEMENTS-Direktive den gesamten XML-Code als elementzentrierten Code abrufen. Beispiel:

SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, ELEMENTS 

Dies ist das elementzentrierte Ergebnis:

<row>
  <ProductModelID>122</ProductModelID>
  <Name>All-Purpose Bike Stand</Name>
</row>
<row>
  <ProductModelID>119</ProductModelID>
  <Name>Bike Wash</Name>
</row>

Deshalb müssen Sie in SQL Server 2000 entweder attributzentriertes oder elementzentriertes XML als Abfrageergebnis auswählen. Ab SQL Server 2005 können Sie jedoch mit geschachtelten FOR XML-Abfragen XML-Code konstruieren, der zum Teil attributzentriert und zum Teil elementzentriert ist.

Weitere Informationen dazu, wie mit geschachtelten FOR XML-Abfragen sowohl attributzentriertes als auch elementzentriertes XML angegeben wird, finden Sie unter FOR XML-Abfragen im Vergleich zu geschachtelten FOR XML-Abfragen und Gestalten von XML mit geschachtelten FOR XML-Abfragen.

In SQL Server 2000 können Sie gleichgeordnete Elemente nur durch Schreiben von Abfragen im EXPLICIT-Modus konstruieren. Dies kann jedoch sehr aufwändig sein. Ab SQL Server 2005 können Sie 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 durch Verwenden einer geschachtelten Abfrage im AUTO-Modus.

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.