FOR XML (SQL Server)

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

Une requête SELECT retourne les résultats sous la forme d'un ensemble de lignes. Vous pouvez si vous le souhaitez récupérer les résultats d'une requête SQL sous forme de code XML en spécifiant la clause FOR XML dans la requête. La clause FOR XML peut être utilisée dans les requêtes de premier niveau et dans les sous-requêtes. La clause FOR XML de premier niveau ne peut être utilisée que dans l'instruction SELECT. Dans les sous-requêtes, FOR XML peut être utilisée dans les instructions INSERT, UPDATE et DELETE. FOR XML peut être également utilisée dans les instructions d’assignation.

Dans une clause FOR XML, vous spécifiez l'un des modes suivants :

  • RAW
  • AUTO
  • EXPLICIT
  • PATH

Le mode RAW génère un élément de ligne unique <par ligne> dans l’ensemble de lignes retourné par l’instruction SELECT. Vous pouvez générer une hiérarchie XML en écrivant des requêtes FOR XML imbriquées.

Le mode AUTO génère l'imbrication dans le code XML résultant en utilisant une heuristique basée sur la manière dont l'instruction SELECT est spécifiée. Vous n'avez qu'un contrôle minimal sur la forme du code XML généré. Les requêtes FOR XML imbriquées peuvent être écrites de façon à générer une hiérarchie XML au-delà de la forme XML générée par l'heuristique du mode AUTO.

Le mode EXPLICIT permet de contrôler davantage la forme du code XML. Vous pouvez combiner des attributs et des éléments à volonté afin de décider de la forme du code XML. Un format spécifique est nécessaire pour l'ensemble de lignes généré suite à l'exécution de requête. Le format d'ensemble de lignes est ensuite mappé au format XML. L'avantage du mode EXPLICIT est qu'il permet de combiner des attributs et des éléments à volonté, de créer des wrappers et des propriétés complexes imbriquées et de créer des valeurs séparées par des espaces (par exemple, l'attribut OrderID peut avoir une liste d'ID d'ordre) ainsi que du contenu mixte.

Toutefois, l'écriture de requêtes en mode EXPLICIT peut être une opération pénible. Vous pouvez utiliser certaines des nouvelles fonctionnalités FOR XML, telles que l'écriture de requêtes FOR XML en mode RAW/AUTO/PATH et la directive TYPE, au lieu d'utiliser le mode EXPLICIT pour générer les hiérarchies. Les requêtes FOR XML imbriquées peuvent produire tout code XML que vous générez à l'aide du mode EXPLICIT. Pour plus d’informations, consultez Utiliser des requêtes FOR XML imbriquées et Directive TYPE dans les requêtes FOR XML.

Le mode PATH, associé à la capacité des requêtes FOR XML imbriquées, offre la flexibilité du mode EXPLICIT sous une forme plus simple.

Ces modes ne s'appliquent qu'aux requêtes pour lesquelles ils sont définis. Ils n'affectent pas les résultats des requêtes suivantes.

La clause FOR XML n'est pas valide en cas de sélection comportant une clause FOR BROWSE.

Exemple

L’instruction SELECT suivante récupère des informations des tables Sales.Customer et Sales.SalesOrderHeader de la base de données AdventureWorks2022 . Cette requête spécifie le mode AUTO dans la clause FOR XML :

USE AdventureWorks2022;
GO
SELECT Cust.CustomerID,
       OrderHeader.CustomerID,
       OrderHeader.SalesOrderID,
       OrderHeader.Status
FROM Sales.Customer Cust 
INNER JOIN Sales.SalesOrderHeader OrderHeader
ON Cust.CustomerID = OrderHeader.CustomerID
FOR XML AUTO;

La clause FOR XML et les noms de serveurs

Quand une instruction SELECT avec une clause FOR XML spécifie un nom en quatre parties dans la requête, le nom du serveur n'est pas renvoyé dans le document XML résultant quand la requête est exécutée sur l'ordinateur local. Cependant, le nom du serveur est renvoyé sous forme de nom en quatre parties quand la requête s'exécute sur un serveur.

Par exemple, envisagez la requête suivante :

SELECT TOP 1 LastName
  FROM ServerName.AdventureWorks2022.Person.Person
  FOR XML AUTO;

 

Serveur local : lorsqu’il ServerName s’agit d’un serveur local, la requête retourne le texte suivant :

<AdventureWorks2022.Person.Person LastName="Achong" />  

 

Serveur réseau : lorsqu’il ServerName s’agit d’un serveur réseau, la requête retourne le texte suivant :

<ServerName.AdventureWorks2022.Person.Person LastName="Achong" />

 

Évitez l’ambiguïté : cette ambiguïté potentielle peut être évitée en spécifiant cet alias :

SELECT TOP 1 LastName
  FROM ServerName.AdventureWorks2022.Person.Person x
  FOR XML AUTO;

Maintenant, une fois l’ambiguïté levée, la requête renvoie :

<x LastName="Achong"/>

Voir aussi

Syntaxe de base de la clause FOR XML
Utiliser le mode RAW avec FOR XML
Utiliser le mode AUTO avec FOR XML
Utiliser le mode EXPLICIT avec FOR XML
Utiliser le mode PATH avec FOR XML
OPENXML (SQL Server)
Ajouter des espaces de noms aux requêtes avec WITH XMLNAMESPACES