Partager 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 au code XML retourné par les requêtes FOR XML d’être traités 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 xml variable de type, ou utiliser XQuery pour interroger le résultat et affecter ce résultat à une xml variable de type pour 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 également traiter le code XML retourné dans la variable, @xà l’aide de l’une xml des méthodes de type de données. Par exemple, vous pouvez récupérer la ProductModelID valeur d’attribut à 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 est retourné en tant que 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 directement l'une des méthodes de type de données xml sur cet XML, comme indiqué dans 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 é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" />  

Retour des 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é sous la forme d'un 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 code XML généré par la requête interne FOR XML est ajouté au code XML généré par l’extérieur FOR XML.

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

Contrôle de la forme des données XML résultantes

Les requêtes FOR XML imbriquées vous permettent de mieux définir 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 sur des attributs et partiellement centrées sur les éléments.

Pour plus d’informations sur la spécification de XML centré sur les attributs et XML centré sur les éléments avec des requêtes FOR XML imbriquées, consultez Requête FOR XML comparée à la requête FOR XML imbriquée et Structurer XML avec des requêtes FOR XML imbriquées.

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

Quel que soit le mode que vous utilisez, les requêtes FOR XML imbriquées fournissent davantage de contrôle dans la description de la forme du code XML résultant. Ils peuvent être utilisés à la place des requêtes en mode EXPLICIT.

Exemples

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

Requête FOR XML comparée à la requête FOR XML imbriquée
Compare une requête FOR XML de niveau unique à une requête FOR XML imbriquée. Cet exemple inclut une démonstration de la façon de spécifier à la fois le code XML centré sur les attributs et centré sur les éléments à la suite de la requête.

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

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

Forme 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.