FOR XML (SQL Server)

S’applique à : SQL Server Azure SQL Database Azure 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é 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 seul élément <row> par ligne dans l’ensemble de lignes qui est 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 XMLL, telles que l'écriture de requêtes FOR XML RAW, AUTO, ou 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.

FOR XML n’est pas valide pour toute sélection utilisée avec une FOR BROWSE clause.

Exemples

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 : Quand ServerName est un serveur local, la requête renvoie :

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

Serveur réseau: Quand ServerName est un serveur réseau, la requête renvoie :

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

Évitez l'ambiguïté: Cette ambiguïté peut être levée à condition de spécifier 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"/>