Construction de code XML à l'aide de FOR XML

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. Elle 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, 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 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.

Les clauses COMPUTE BY et FOR BROWSE

La clause FOR XML n'est pas valide en cas de sélection comportant une clause COMPUTE BY ou FOR BROWSE. Par exemple, la syntaxe suivante générera une erreur :

SELECT TOP 5 SalesOrderID, UnitPrice 
FROM Sales.SalesOrderDetail 
ORDER BY SalesOrderID COMPUTE SUM(UnitPrice) BY SalesOrderID
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.AdventureWorks2008R2.Person.Person
FOR XML AUTO

Quand ServerName est un serveur local, la requête renvoie :

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

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

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

Cette ambiguïté peut être levée à condition de spécifier cet alias :

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

Cette requête donne le résultat suivant :

<x LastName="Achong"/>