Dela via


Använda kapslade FOR XML-frågor

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

XML- datatyp och TYPE-direktivet i FOR XML-förfrågningar gör det möjligt att bearbeta den XML som returneras av FOR XML-förfrågningarna både på servern och klienten.

Bearbetning med xml-typvariabler

Du kan tilldela FOR XML-frågeresultatet till en XML- typvariabel eller använda XQuery för att fråga efter resultatet och tilldela resultatet till en XML- typvariabel för mer bearbetning.

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

Du kan dessutom bearbeta XML-koden som returneras i variabeln @xmed hjälp av någon av de xml- datatypsmetoderna. Du kan till exempel hämta attributet ProductModelID med hjälp av metoden value().

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

I följande exempel returneras FOR XML-frågeresultatet som en xml- typ, eftersom TYPE-direktivet anges i FOR XML-satsen.

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

Det här är resultatet:

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

Eftersom resultatet är av XML- typ kan du ange någon av de xml- datatypsmetoderna direkt mot denna XML, som du ser i följande fråga. I frågan används metoden query() (xml Data Type) för att hämta det första <row> elementet som är underordnat <myRoot>-elementet.

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

Det här är resultatet:

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

Returnera inre FOR XML-frågeresultat till yttre frågor som xml-typinstanser

Du kan skriva kapslade FOR XML frågor där resultatet av den inre frågan returneras som en XML- typ till den yttre frågan. Till exempel:

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

Observera följande från föregående fråga:

  • XML-koden som genereras av den inre FOR XML-frågan läggs till i XML-koden som genereras av den yttre FOR XML.

  • Den inre frågan anger TYPE-direktivet. Därför är XML-data som returneras av den inre frågan av xml--typ. Om TYPE-direktivet inte har angetts returneras resultatet av inre FOR XML fråga som nvarchar(max) och XML-data är entitetiserad.

Kontrollera formen på resulterande XML-data

Kapslade FOR XML-frågor ger dig mer kontroll när du definierar formen på resulterande XML-data. Du kan använda kapslade FOR XML-frågor för att konstruera XML som delvis är attributcentrerad och delvis elementcentrerad.

Mer information om hur du specificerar både attributcentrerad och elementcentrerad XML med kapslade FOR XML-frågor finns i FOR XML-fråga jämfört med kapslad FOR XML-fråga och Forma XML med kapslade FOR XML-frågor.

Du kan generera XML-hierarkier som innehåller syskon genom att ange kapslat AUTO-läge FÖR XML-frågor. Mer information finns i Generera syskon med en kapslad autolägesfråga.

Oavsett vilket läge du använder ger kapslade FOR XML-frågor mer kontroll när du beskriver formen på den resulterande XML-koden. De kan användas i stället för EXPLICIT-lägesfrågor.

Exempel

Följande avsnitt innehåller exempel på kapslade FOR XML-frågor.