Bon alors je vais essayer de vous présenter quelques utilisations du XML avec le SGBD de Microsoft.
Attention, c'est juste un 'papier' d'information, ca veut dire que pour que cela soit vraiment utile pour vous, il vous faudra aussi chercher de votre coté.
Ce que je vais présenter:
- Les résultats en XML
- XML : un type de données
- Les templates XML
Les resultats en XML:
Une fonction intéressante de SQL Server, c'est la possibilité de sortir les résultats d'un SELECT sous forme de XML.
Pour cela on utilisera la clause 'FOR XML'. Cette clause est accompagnée de 3 options:
RAW
AUTO
EXPLICIT
L'option RAW:
Cette option permet d'afficher les tuples du résultat sous forme d'élèments XML. Chaque élèment du tuple est mappé en un attibut.
Exemple:
Code :
- SELECT f.ForumeurID, m.messID, m.Date
- FROM Forumeurs f INNER JOIN Messages m ON f.ForumeurID = m.ForumeurID
- ORDER BY f.ForumeurID
- FOR XML RAW
|
Et en résultat:
Code :
- <row ForumeurID="1" messID="1234" Date="2005-07-2T09:24:30"/>
- <row ForumeurID="2" messID="1235" Date="2005-07-2T09:25:21"/>
- <row ForumeurID="1" messID="1236" Date="2005-07-2T09:25:30"/>
- <row ForumeurID="2" messID="1237" Date="2005-07-2T09:26:42"/>
- .......
|
Remarque: Si une valeur est nulle alors n'est pas mappée en tant qu'élèment.
L'option AUTO:
Avec cette option, le résultat n'est plus sous forme de simple élèments mais sous forme de noeuds XML.
Exemple:
Code :
- SELECT f.ForumeurID, f.Prenom, m.messID, m.Date
- FROM Messages m INNER JOIN Forumeurs f ON m.ForumeurID = f.ForumeurID
- ORDER BY f.ForumeurID
- FOR XML AUTO
|
Et en résultat:
Code :
- <Forumeurs ForumeurID="1" Prenom="Toto">
- <Messages messID="1234" Date="2005-07-2T09:24:30" ForumeurID="1" />
- <Messages messID="1236" Date="2005-07-2T09:25:30" ForumeurID="1" />
- </Forumeurs>
- <Forumeurs ForumeurID="2" Prenom="Dupont">
- <Messages messID="1235" Date="2005-07-2T09:25:21" ForumeurID="2" />
- <Messages messID="1237" Date="2005-07-2T09:26:42" ForumeurID="2" />
- </Forumeurs>
|
Comme on peut le remarquer, les attributs sont associés dans l'ordre de gauche à droite du Select.(Je suis pas certain que tout le monde m'est compris...)
Bon....Exemple:
Code :
- SELECT f.Prenom, f.ForumeurID, m.messID, m.Date
- FROM Messages m INNER JOIN Forumeurs f ON m.ForumeurID = f.ForumeurID
- ORDER BY f.ForumeurID
- FOR XML AUTO
|
Et en résultat:
Code :
- <Forumeurs Prenom="Toto" ForumeurID="1" >
- <Messages messID="1234" Date="2005-07-2T09:24:30" ForumeurID="1" />
- <Messages messID="1236" Date="2005-07-2T09:25:30" ForumeurID="1" />
- </Forumeurs>
- <Forumeurs Prenom="Dupont" ForumeurID="2">
- <Messages messID="1235" Date="2005-07-2T09:25:21" ForumeurID="2" />
- <Messages messID="1237" Date="2005-07-2T09:26:42" ForumeurID="2" />
- </Forumeurs>
|
Même remarque que pour l'option RAW, les colonnes dont la valeur est nulle ne sont pas mappées.
Autre point important, souvent il n'y a aucun 'root node', de ce fait le document XML en sortie n'est pas valide...c'est pour cela qu'est faite l'option EXPLICIT.
L'option EXPLICIT:
Bon alors pour utiliser cette option, il va falloir séparer notre précédente requête en 2 requêtes et nous utiliserons ensuite un UNION.
Il est nécéssaire ici de séparer la requête pour la raison suivante: chacune des requêtes correspondra à un niveau dans l'arbre XML de sortie.
Exemple:
Code :
- SELECT 1 as Tag, NULL as Parent, // Ici c'est le Tag 1 sans parent
- f.ForumeurID as [Forumeurs!1!ForumeurID],//Noeud Forumeurs de tag 1 et correspondant à l'attribut ForumeurID
- NULL as [Messages!2!messID]
- FROM Forumeurs f
- UNION ALL
- SELECT 2 as Tag, 1 as Parent,// Ici c'est le Tag 2 avec pour parent le Tag 1
- f.ForumeurID as [Forumeurs!1!ForumeurID],
- m.messID as [Messages!2!messID]
- FROM Forumeurs f INNER JOIN Messages m ON f.ForumeurID = m.ForumeurID
- ORDER BY [Forumeurs!1!ForumeurID], [Messages!2!messID]
- FOR XML EXPLICIT
|
Et en résultat:
Code :
- <Forumeurs ForumeurID="1" >
- <Messages messID="1234">
- <Messages messID="1236">
- </Forumeurs>
- <Forumeurs ForumeurID="2">
- <Messages messID="1235" >
- <Messages messID="1237" >
- </Forumeurs>
|
Ce XML est directment exploitable par, par exemple du C#.
XML: un type de données
Par ce titre je veux dire que l'on peut stocker du XML dans une BDD. Il est certain que cette fonction existe depuis SQL Server 2000 mais cela été quelque peu difficile et peu pratique à utiliser. Maintenant cela devient un jeu d'enfant.
Bon un exemple:
Création de notre table:
Code :
- CREATE TABLE Messages
- {
- idMessage INT IDENTITY PRIMARY KEY,
- Contenu XML
- }
|
C'est cette ligne qui spécifie que nous avons à faire à du XML:
Insertion des données:
Code :
- INSERT INTO Messages(Contenu)
- VALUES('<Mess>
- <cat c="SGBD"/>
- <sujet>SQL Server et le XML<sujet/>
- </Mess>')
|
SELECT:
On s'amuse avec XPATH:
Code :
- SELECT idMessage, Contenu.value('/Mess[1]/sujet[1]','varchar(80)')
- FROM Messages
- WHERE Contenu.exist('/Mess/sujet/text()[contains(.,"XML" )]')=1
|
J'espère que tout le monde a à peu près compris et que cela permettra à certains d'éviter des heures de google.
P.S: Toute remarque est la bienvenue.
Message édité par cesarr89 le 26-07-2005 à 14:12:37