par Julian Watson - Mis en ligne le 19/05/2004
Comment renvoyer des données sous forme de XML hiérarchique
Les bases de données relationnelles
stockent souvent leurs données dans
une structure arborescente ou hiérarchique,
où chaque élément est associé
à un autre, selon une relation parentenfant.L'exemple le plus courant est la
structure ou organigramme de direction
d'une société comme celle que
montre la figure 1. La hiérarchie a généralement
une profondeur arbitraire
et chaque élément ne contient des informations
que sur sa position relative
dans l'arbre. A en juger par les nombreuses
questions des newsgroups,
une exigence courante se dessine : utiliser
SQL Server pour renvoyer la totalité
de l'arbre en format XML. Par
exemple, beaucoup doivent afficher
une hiérarchie sur une page ou un rapport
Web. La figure 2 montre un arbre
affiché en mode XML.
Bien que le support XML de SQL
Server 2000 soit souple, il ne permet
pas de renvoyer XML hiérarchique, selon
une profondeur arbitraire. Mais on
peut obtenir ce résultat grâce à la commande
FOR XML EXPLICIT T-SQL.
Certaines techniques d'accès à des
données hiérarchiques par l'intermédiaire
de T-SQL peuvent devenir très
complexes. Cet article explique les
techniques et bâtit le T-SQL en petites
étapes pour en faciliter la compréhension.
En cours de trajet, j'aborde des
méthodes comme l'utilisation de SQL
dynamique et je révèle quelques trucs
et astuces, y compris comment utiliser
des tables temporaires au lieu
d'UNIONs dans vos instructions FOR
XML EXPLICIT pour réduire la taille et
la complexité de ces instructions.
L'article suppose une bonne connaissance
de XML sur SQL Server 2000 et
l'utilisation de la table universelle.
Arbres XML : Pas à pas
Pour représenter une hiérarchie dans
une base de données, on utilise généralement
une table dotée d’un self
join illustrée figure 3. Dans cette table,
qui contient des informations sur
chaque employé, la colonne ReportsTo
est une clé étrangère qui pointe sur
une autre ligne dans la même table,
formant le self join. On peut raffiner
cette méthode en divisant l’information
entre deux tables, l’une contenant
l’information sur les employés et
l’autre contenant l’information sur les
relations, comme le montre la figure 4.
Le listing 1 montre un script chargé de
créer les tables et de les peupler avec
des données (par souci de simplicité,
je n’ai pas peuplé toutes les colonnes).
Pour renvoyer les données en format
XML, on utilise le mode Explicit,
en écrivant des requêtes pour produire un jeu de résultats d’un certain format.
En ajoutant la clause FOR XML EXPLICIT
à la fin de votre requête, vous pouvez
renvoyer les résultats comme XML
plutôt que comme un recordset. Pour
créer le XML que montre la figure 2, il
faut d’abord créer une requête qui produit
le jeu de résultats illustré figure 5.
A noter que les noms de colonnes,
l’ordre des données et les données
elles-mêmes ont tous leur importance
d’un point de vue hiérarchique.
La structure de la figure 5 est dite
table universelle. Un terme trompeur
car il n’y a pas vraiment de table : il suffit
d’écrire une requête qui renvoie des
données dans ce format. Le format
table universelle est un moyen pour visualiser
la sortie de la requête demandée.
En ajoutant FOR XML EXPLICIT à
cette requête, on produit le XML de la
figure 2. SQL Server est pointilleux sur
la structure de la table universelle. Les
noms de colonnes et l’ordre des lignes
doivent tous être corrects. Faute de
quoi, une erreur surviendra – ou pire,
la requête produira un XML de structure
incorrecte. En comparant les données
de la figure 5 au XML de la figure
2, on commence à voir comment
SQL Server associe les données et les
noms de colonnes à XML.
Les colonnes Tag et Parent spéciales
contiennent des métadonnées
qui définissent la hiérarchie XML. Si
Parent est 0 ou nul, cette ligne devient
le noeud racine. Pour toutes les autres
lignes, la colonne Parent stocke le tag
du parent. L’ordre des lignes est important
ici – les enfants doivent suivre
immédiatement le parent.
Les noms des autres colonnes
contiennent aussi des métadonnées
que SQL Server utilise pour définir le
reste de la structure XML. Dans
l’exemple de la figure 5, Employee!
1!EmployeeID ajoute l’attribut
EmployeeID à un élément nommé
Employee. Le 1 indique le numéro du
tag et assure que l’élément est placé
correctement dans la hiérarchie. La valeur
de l’attribut est la valeur de la colonne.
La colonne Employee!1!First-
Name ajoute un second attribut,
FirstName, à l’élément Employee. Vous
en savez maintenant assez sur la table
universelle pour produire une structure
arborescente hiérarchique.
Téléchargez cette ressource
SMART DSI – N°36
La Revue SMART DSI, analyses et dossiers pour tous les acteurs de la transformation numérique de l'entreprise, met sa nouvelle édition en accès sur demande, gagnez en compétences et expertise IT Professionnelle, découvrez les dossiers experts.
Les articles les plus consultés
- ActiveViam fait travailler les data scientists et les décideurs métiers ensemble
- Stockage autonome, Evolutivité & Gestion intelligente, Pure Storage offre de nouvelles perspectives aux entreprises
- La blockchain en pratique
- 10 grandes tendances Business Intelligence
- Intelligence Artificielle : DeepKube sécurise en profondeur les données des entreprises
Les plus consultés sur iTPro.fr
- Défis et bénéfices d’infuser l’IA dans l’analytique et la BI
- Mieux protéger l’entreprise à l’ère du travail hybride et du Cloud
- Les entreprises concentrent les investissements sur l’innovation, l’efficacité et la résilience
- L’IA profite au marché du mobile !
- La législation européenne sur l’IA entre en vigueur. Comment s’y préparer au mieux ?