Exemple : Récupérer des informations sur les employés
S’applique à :SQL Server
Azure SQL Database
Azure SQL Managed Instance
Cet exemple extrait un ID et un nom pour chaque employé. Dans la base de données AdventureWorks2022
, les ID des employés se trouvent dans la colonne BusinessEntityID de la table Employee. Les noms des employés figurent dans la table Person. La colonne BusinessEntityID peut être utilisée pour joindre les tables.
Supposons que vous souhaitez que la transformation FOR XML EXPLICIT génère du code XML comme indiqué dans l’exemple suivant :
<Employee EmpID="1" >
<Name FName="Ken" LName="Sánchez" />
</Employee>
...
Étant donné que la hiérarchie comprend deux niveaux, vous écrivez deux requêtes SELECT
et appliquez UNION ALL. Il s’agit de la première requête qui récupère les valeurs de l’élément <Employee>
et de ses attributs. La requête affecte 1
comme Tag
valeur pour l’élément <Employee>
et NULL en tant que Parent
, car il s’agit de l’élément de niveau supérieur.
SELECT 1 as Tag,
NULL as Parent,
E.BusinessEntityID AS [Employee!1!EmpID],
NULL as [Name!2!FName],
NULL as [Name!2!LName]
FROM HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON E.BusinessEntityID = P.BusinessEntityID;
Voici la seconde requête. Il récupère les valeurs de l’élément <Name>
. Il affecte 2
comme Tag
valeur pour l’élément <Name>
et 1
comme Parent
valeur d’étiquette identifiant <Employee>
comme parent.
SELECT 2 as Tag,
1 as Parent,
E.BusinessEntityID,
FirstName,
LastName
FROM HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON E.BusinessEntityID = P.BusinessEntityID;
Vous combinez ces requêtes avec UNION AL
L, appliquez FOR XML EXPLICIT
et spécifiez la clause ORDER BY
requise. Vous devez trier l'ensemble de lignes par BusinessEntityID
puis par nom afin que les valeurs NULL du nom apparaissent en premier. En exécutant la requête suivante sans la clause FOR XML, vous pouvez visualiser la table universelle générée.
Voici la requête finale :
SELECT 1 as Tag,
NULL as Parent,
E.BusinessEntityID as [Employee!1!EmpID],
NULL as [Name!2!FName],
NULL as [Name!2!LName]
FROM HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON E.BusinessEntityID = P.BusinessEntityID
UNION ALL
SELECT 2 as Tag,
1 as Parent,
E.BusinessEntityID,
FirstName,
LastName
FROM HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON E.BusinessEntityID = P.BusinessEntityID
ORDER BY [Employee!1!EmpID],[Name!2!FName]
FOR XML EXPLICIT;
Voici le résultat partiel :
<Employee EmpID="1">
<Name FName="Ken" LName="Sánchez" />
</Employee>
<Employee EmpID="2">
<Name FName="Terri" LName="Duffy" />
</Employee>
...
La première instruction SELECT
spécifie les noms des colonnes dans l'ensemble de lignes obtenu. Ces noms forment deux groupes de colonnes. Le groupe qui possède la valeur Tag
1
dans le nom de colonne identifie Employee
en tant qu'élément et EmpID
en tant qu'attribut. L’autre groupe de colonnes a Tag
une valeur 2
dans la colonne et identifie <Name>
comme élément et FName
LName
comme attributs.
Le tableau suivant montre l'ensemble de lignes partiel généré par la requête :
Balise | Parent | Employee!1!EmpID | Name!2!FName | Name!2!LName |
---|---|---|---|---|
1 | NULL | 1 | NULL | NULL |
2 | 1 | 1 | Ken | Sánchez |
1 | NULL | 2 | NULL | NULL |
2 | 1 | 2 | Terri | Duffy |
1 | NULL | 3 | NULL | NULL |
2 | 1 | 3 | Roberto | Tamburello |
... | ... | ... | ... | ... |
Les lignes de la table universelle sont traitées comme suit pour générer l'arborescence XML obtenue :
La première ligne identifie la valeur Tag
1
. Par conséquent, le groupe de colonnes qui a la valeur Tag
1
est identifié, Employee!1!EmpID
. Cette colonne identifie Employee
en tant que nom d'élément. Un <Employee>
élément est ensuite créé avec EmpID
des attributs. Les valeurs de colonnes correspondantes sont affectées à ces attributs.
La deuxième ligne a la valeur Tag
2
. Par conséquent, le groupe de colonnes qui a la valeur Tag
2
dans le nom de colonne, Name!2!FName
, Name!2!LName
, est identifié. Ces noms de colonnes identifient Name
comme nom d'élément. Un <Name>
élément est créé avec FName
des attributs et LName
des attributs. Les valeurs de colonnes correspondantes sont ensuite affectées à ces attributs. Cette ligne identifie 1
comme Parent
. Cet enfant d’élément est ajouté à l’élément précédent <Employee>
.
Ce processus est répété pour le reste des lignes de l'ensemble de lignes. Notez l'importance du tri des lignes dans la table universelle pour que FOR XML EXPLICIT puisse traiter l'ensemble de lignes dans l'ordre et générer le document XML souhaité.
Voir aussi
Commentaires
https://aka.ms/ContentUserFeedback.
Prochainement : Tout au long de l'année 2024, nous supprimerons progressivement les GitHub Issues en tant que mécanisme de retour d'information pour le contenu et nous les remplacerons par un nouveau système de retour d'information. Pour plus d’informations, voir:Soumettre et afficher des commentaires pour