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 XML
L, 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"/>