Share via


Utiliser des requêtes FOR XML imbriquées

Le xml type de données et la directive TYPE dans les requêtes FOR XML permettent de traiter le code XML retourné par les requêtes FOR XML sur le serveur ainsi que 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> élément enfant 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" />  

Renvoi de résultats de requêtes FOR XML internes à des 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ôle de 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.

Exemples

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

Comparaison de la requête FOR XML et de la requête FOR XML imbriquée
Compare une requête FOR XML d'un seul niveau à une requête FOR XML imbriquée. Cet exemple inclut une démonstration de la manière de spécifier à la fois des données XML centrées sur l'attribut et centrées sur l'élément comme résultat de requête.

Générer des frères à l’aide d’une requête imbriquée en mode AUTO
Montre comment générer des frères à l'aide d'une requête imbriquée en mode AUTO

Utiliser des requêtes FOR XML imbriquées dans ASP.NET
Montre comment une application ASPX peut utiliser FOR XML pour retourner des données XML à partir de SQL Server.

Façonner des données XML avec des requêtes FOR XML imbriquées
Montre comment utiliser des requêtes FOR XML imbriquées pour contrôler la structure d'un document XML créé par SQL Server.