Partager via


Utiliser le mode AUTO avec FOR XML

Comme décrit dans FOR XML (SQL Server), le mode AUTO retourne les résultats de la requête en tant qu’éléments XML imbriqués. Cela ne permet pas de contrôler beaucoup la forme du code XML généré à partir d’un résultat de requête. Les requêtes en mode AUTO sont utiles si vous souhaitez générer des hiérarchies simples. Toutefois, utiliser le mode EXPLICIT avec FOR XML et utiliser le mode PATH avec FOR XML offre davantage de contrôle et de flexibilité pour décider de la forme du code XML à partir d’un résultat de requête.

Chaque table de la clause FROM, à partir de laquelle au moins une colonne est répertoriée dans la clause SELECT, est représentée en tant qu’élément XML. Les colonnes répertoriées dans la clause SELECT sont mappées à des attributs ou sous-éléments, si l’option ELEMENTS facultative est spécifiée dans la clause FOR XML.

La hiérarchie XML, imbrication des éléments, dans le code XML résultant est basée sur l’ordre des tables identifiées par les colonnes spécifiées dans la clause SELECT. Par conséquent, l’ordre dans lequel les noms de colonnes sont spécifiés dans la clause SELECT est significatif. La première table la plus à gauche qui est identifiée forme l’élément supérieur dans le document XML résultant. La deuxième table la plus à gauche, identifiée par les colonnes de l’instruction SELECT, forme un sous-élément dans l’élément supérieur, et ainsi de suite.

Si un nom de colonne répertorié dans la clause SELECT provient d’une table déjà identifiée par une colonne précédemment spécifiée dans la clause SELECT, la colonne est ajoutée en tant qu’attribut de l’élément déjà créé, au lieu d’ouvrir un nouveau niveau de hiérarchie. Si l’option ELEMENTS est spécifiée, la colonne est ajoutée en tant qu’attribut.

Par exemple, exécutez cette requête :

SELECT Cust.CustomerID,   
       OrderHeader.CustomerID,  
       OrderHeader.SalesOrderID,   
       OrderHeader.Status,  
       Cust.CustomerType  
FROM Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader  
WHERE Cust.CustomerID = OrderHeader.CustomerID  
ORDER BY Cust.CustomerID  
FOR XML AUTO  

Voici le résultat partiel :

<Cust CustomerID="1" CustomerType="S">  
  <OrderHeader CustomerID="1" SalesOrderID="43860" Status="5" />  
  <OrderHeader CustomerID="1" SalesOrderID="44501" Status="5" />  
  <OrderHeader CustomerID="1" SalesOrderID="45283" Status="5" />  
  <OrderHeader CustomerID="1" SalesOrderID="46042" Status="5" />  
</Cust>  
...  

Notez ce qui suit dans la clause SELECT :

  • CustomerID fait référence à la table Cust. Par conséquent, un <Cust> élément est créé et CustomerID est ajouté en tant qu’attribut.

  • Ensuite, trois colonnes, OrderHeader.CustomerID, OrderHeader.SaleOrderID et OrderHeader.Status, référencent la table OrderHeader. Par conséquent, un <OrderHeader> élément est ajouté en tant que sous-élément de l’élément>Cust< et les trois colonnes sont ajoutées en tant qu’attributs de .<OrderHeader>

  • Ensuite, la colonne Cust.CustomerType fait référence à nouveau à la table Cust qui a déjà été identifiée par la colonne Cust.CustomerID. Par conséquent, aucun élément n’est créé. Au lieu de cela, l’attribut CustomerType est ajouté à l’élément <Cust> qui a été créé précédemment.

  • La requête spécifie des alias pour les noms de table. Ces alias apparaissent en tant que noms d’éléments correspondants.

  • ORDER BY est requis pour regrouper tous les enfants sous un seul parent.

Cette requête est similaire à la précédente, sauf que la clause SELECT spécifie des colonnes dans la table OrderHeader avant les colonnes de la table Cust. Par conséquent, le premier <OrderHeader> élément est créé, puis l’élément <Cust> enfant est ajouté à celui-ci.

select OrderHeader.CustomerID,  
       OrderHeader.SalesOrderID,   
       OrderHeader.Status,  
       Cust.CustomerID,   
       Cust.CustomerType  
from Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader  
where Cust.CustomerID = OrderHeader.CustomerID  
for xml auto  

Voici le résultat partiel :

<OrderHeader CustomerID="1" SalesOrderID="43860" Status="5">  
  <Cust CustomerID="1" CustomerType="S" />  
</OrderHeader>  
...  

Si l’option ELEMENTS est ajoutée dans la clause FOR XML, le code XML centré sur les éléments est retourné.

SELECT Cust.CustomerID,   
       OrderHeader.CustomerID,  
       OrderHeader.SalesOrderID,   
       OrderHeader.Status,  
       Cust.CustomerType  
FROM Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader  
WHERE Cust.CustomerID = OrderHeader.CustomerID  
ORDER BY Cust.CustomerID  
FOR XML AUTO, ELEMENTS  

Voici le résultat partiel :

<Cust>  
  <CustomerID>1</CustomerID>  
  <CustomerType>S</CustomerType>  
  <OrderHeader>  
    <CustomerID>1</CustomerID>  
    <SalesOrderID>43860</SalesOrderID>  
    <Status>5</Status>  
  </OrderHeader>  
   ...  
</Cust>  
...  

Dans cette requête, les valeurs CustomerID sont comparées d’une ligne à l’autre lors de la création des <éléments Cust> , car CustomerID est la clé primaire de la table. Si CustomerID n’est pas identifié comme la clé primaire de la table, toutes les valeurs de colonne (CustomerID, CustomerType dans cette requête) sont comparées d’une ligne à l’autre. Si les valeurs diffèrent, un nouvel <élément Cust> est ajouté au code XML.

Lorsque vous comparez ces valeurs de colonne, si l’une des colonnes à comparer est de type texte, ntext, image ou xml, FOR XML suppose que les valeurs sont différentes et non comparées, même si elles peuvent être identiques. Cela est dû au fait que la comparaison d’objets volumineux n’est pas prise en charge. Les éléments sont ajoutés au résultat de chaque ligne sélectionnée. Notez que les colonnes de (n)varchar(max) et varbinary(max) sont comparées.

Lorsqu’une colonne de la clause SELECT ne peut pas être associée à l’une des tables identifiées dans la clause FROM, comme dans le cas d’une colonne d’agrégation ou d’une colonne calculée, la colonne est ajoutée dans le document XML dans le niveau d’imbrication le plus profond en place lorsqu’elle est rencontrée dans la liste. Si une telle colonne apparaît comme la première colonne de la clause SELECT, la colonne est ajoutée à l’élément supérieur.

Si le caractère générique astérisque (*) est spécifié dans la clause SELECT, l’imbrication est déterminée de la même façon que précédemment décrite, en fonction de l'ordre de retour des lignes par le moteur de requête.

Dans cette section

Les rubriques suivantes fournissent plus d’informations sur le mode AUTO :

Voir aussi

SELECT (Transact-SQL)
FOR XML (SQL Server)