Utiliser des requêtes FOR XML imbriquées

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Le type de données xml et la directive TYPE dans les requêtes FOR XML permettent au XML retourné par les requêtes FOR XML d’être traité sur le serveur et sur le client.

Traitement avec des variables de type xml

Vous pouvez affecter le résultat de la requête FOR XML à une variable de type xml ou bien utiliser XQuery pour interroger le résultat et affecter celui-ci à une variable de type xml en vue d’un traitement supplémentaire.

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

Vous pouvez poursuivre le traitement du document XML renvoyé dans la variable @xà l’aide de l’une des méthodes de type de données xml . Par exemple, vous pouvez extraire la valeur de l’attribut ProductModelID à l’aide de la méthode value().

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

Dans l’exemple suivant, le résultat de la requête FOR XML renvoyé est de type xml car la directive TYPE est spécifiée dans la clause FOR XML .

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

Voici le résultat obtenu :

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

Étant donné que le résultat est de type xml , vous pouvez spécifier l’une des méthodes de type de données xml directement par rapport à ce document XML, comme le montre la requête suivante. Dans la requête, la méthode query() (type de données xml) est utilisée pour récupérer le premier <row> enfant d’élément de l’élément <myRoot> .

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

Voici le résultat obtenu :

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

Retourner les résultats de requête FOR XML internes aux requêtes externes en tant qu’instances de type XML

Vous pouvez écrire des requêtes FOR XML imbriquées où le résultat de la requête interne est retourné en tant que type xml à la requête externe. Par exemple :

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

Notez les points suivants dans la requête précédente :

  • Le XML généré par la requête FOR XML interne est ajouté au XML généré par la requête FOR XMLexterne.

  • La requête interne spécifie la directive TYPE . Par conséquent, les données XML retournées par la requête interne sont du type xml . Si la directive TYPE n’est pas spécifiée, le résultat de la requête FOR XML interne est retourné en tant que nvarchar(max) et les données XML sont converties en entités.

Contrôler la forme des données XML résultantes

Les requêtes FOR XML imbriquées vous permettent de mieux contrôler la forme des données XML résultantes. Vous pouvez utiliser des requêtes FOR XML imbriquées pour construire des données XML centrées partiellement sur l'attribut et partiellement sur l'élément.

Pour plus d’informations sur la spécification de données XML centrées sur l’attribut et sur l’élément avec des requêtes FOR XML imbriquées, consultez Comparaison de la requête FOR XML et de la requête FOR XML imbriquée et Façonner des données XML avec des requêtes FOR XML imbriquées.

Vous pouvez générer des hiérarchies XML qui incluent des frères en spécifiant des requêtes FOR XML en mode AUTO imbriquées. Pour plus d’informations, consultez Générer des frères à l’aide d’une requête imbriquée en mode AUTO.

Quel que soit le mode utilisé, les requêtes FOR XML imbriquées procurent davantage de contrôle dans la description de la forme des données XML résultantes. Elles peuvent être utilisées à la place des requêtes en mode EXPLICIT.

Examples

Les rubriques suivantes fournissent des exemples de requêtes FOR XML imbriquées.