Delen via


Geneste FOR XML-query's gebruiken

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Het xml- gegevenstype en de TYPE-instructie in FOR XML-query's maken het mogelijk dat de door deze query's geretourneerde XML zowel op de server als op de client wordt verwerkt.

Verwerken met xml-typevariabelen

U kunt het RESULTAAT van de FOR XML-query toewijzen aan een XML--typevariabele of XQuery gebruiken om een query uit te voeren op het resultaat en dat resultaat toewijzen aan een xml- typevariabele voor meer verwerking.

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" />

U kunt de XML die wordt geretourneerd in de variabele, @x, ook verwerken met behulp van een van de xml- gegevenstypemethoden. U kunt bijvoorbeeld de ProductModelID kenmerkwaarde ophalen met behulp van de methode value().

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

In het volgende voorbeeld wordt het FOR XML-queryresultaat geretourneerd als een xml--type, omdat de TYPE-instructie is opgegeven in de FOR XML-clausule.

SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=119 or ProductModelID=122
FOR XML RAW, TYPE,ROOT('myRoot');

Dit is het resultaat:

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

Omdat het resultaat van xml- type is, kunt u een van de xml- gegevenstypemethoden rechtstreeks opgeven op basis van deze XML, zoals wordt weergegeven in de volgende query. In de query wordt de query()-methode (XML-gegevenstype) gebruikt om het eerste <row>-subelement van het <myRoot>-element op te halen.

SELECT  (SELECT ProductModelID, Name
         FROM Production.ProductModel
         WHERE ProductModelID=119 or ProductModelID=122
         FOR XML RAW, TYPE,ROOT('myRoot')).query('/myRoot[1]/row[1]');

Dit is het resultaat:

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

Binnenste FOR XML-queryresultaten retourneren aan externe query's als exemplaren van het XML-type

U kunt geneste FOR XML query's schrijven waarbij het resultaat van de binnenste query wordt geretourneerd als een xml- type naar de buitenste query. Bijvoorbeeld:

SELECT Col1,
       Col2,
       ( SELECT Col3, Col4
        FROM  T2
        WHERE T2.Col = T1.Col
        ...
        FOR XML AUTO, TYPE )
FROM T1
WHERE ...
FOR XML AUTO, TYPE;

Let op het volgende uit de vorige query:

  • De XML die door de binnenste FOR XML query wordt gegenereerd, wordt toegevoegd aan de XML die wordt gegenereerd door de buitenste FOR XML.

  • De binnenste query specificeert de TYPE directive. De XML-gegevens die door de binnenste query worden geretourneerd, zijn daarom van xml- type. Als de TYPE-instructie niet is opgegeven, wordt het resultaat van de interne FOR XML query geretourneerd als nvarchar(max) en de XML-gegevens zijn geëntitiseerd.

De vorm van resulterende XML-gegevens beheren

Geneste FOR XML-query's bieden meer controle over het definiëren van de vorm van de resulterende XML-gegevens. U kunt geneste FOR XML-query's gebruiken om XML te maken die deels kenmerkgericht en deels elementgericht is.

Zie voor meer informatie over het specificeren van zowel kenmerkgerichte als elementgerichte XML met geneste FOR XML-query's, FOR XML-query vergeleken met geneste FOR XML-query's en Shape XML met geneste FOR XML-query's.

U kunt XML-hiërarchieën genereren die broers en zussen bevatten door geneste AUTO-modus VOOR XML-query's op te geven. Zie Genereer broers en zussen met een geneste automodusqueryvoor meer informatie.

Ongeacht de modus die u gebruikt, bieden geneste FOR XML-query's meer controle bij het beschrijven van de vorm van de resulterende XML. Ze kunnen worden gebruikt in de plaats van modusquery's zoals EXPLICIET.

Voorbeelden

De volgende onderwerpen bevatten voorbeelden van geneste FOR XML-query's.