SQL Server et le XML

SQL Server et le XML - SQL/NoSQL - Programmation

Marsh Posté le 26-07-2005 à 10:24:04    

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 :
  1. SELECT f.ForumeurID, m.messID, m.Date
  2. FROM Forumeurs f INNER JOIN Messages m ON f.ForumeurID = m.ForumeurID
  3. ORDER BY f.ForumeurID
  4. FOR XML RAW


 
Et en résultat:
 

Code :
  1. <row ForumeurID="1" messID="1234" Date="2005-07-2T09:24:30"/>
  2. <row ForumeurID="2" messID="1235" Date="2005-07-2T09:25:21"/>
  3. <row ForumeurID="1" messID="1236" Date="2005-07-2T09:25:30"/>
  4. <row ForumeurID="2" messID="1237" Date="2005-07-2T09:26:42"/>
  5. .......


 
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 :
  1. SELECT f.ForumeurID, f.Prenom, m.messID, m.Date
  2. FROM Messages m INNER JOIN Forumeurs f ON m.ForumeurID = f.ForumeurID
  3. ORDER BY f.ForumeurID
  4. FOR XML AUTO


 
Et en résultat:
 

Code :
  1. <Forumeurs ForumeurID="1" Prenom="Toto">
  2. <Messages messID="1234" Date="2005-07-2T09:24:30"  ForumeurID="1" />
  3. <Messages messID="1236" Date="2005-07-2T09:25:30"  ForumeurID="1" />
  4. </Forumeurs>
  5. <Forumeurs ForumeurID="2" Prenom="Dupont">
  6. <Messages messID="1235" Date="2005-07-2T09:25:21" ForumeurID="2" />
  7. <Messages messID="1237" Date="2005-07-2T09:26:42"  ForumeurID="2" />
  8. </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 :
  1. SELECT  f.Prenom, f.ForumeurID, m.messID, m.Date
  2. FROM Messages m INNER JOIN Forumeurs f ON m.ForumeurID = f.ForumeurID
  3. ORDER BY f.ForumeurID
  4. FOR XML AUTO


 
Et en résultat:  
 

Code :
  1. <Forumeurs Prenom="Toto" ForumeurID="1" >
  2. <Messages messID="1234" Date="2005-07-2T09:24:30"  ForumeurID="1" />
  3. <Messages messID="1236" Date="2005-07-2T09:25:30"  ForumeurID="1" />
  4. </Forumeurs>
  5. <Forumeurs  Prenom="Dupont" ForumeurID="2">
  6. <Messages messID="1235" Date="2005-07-2T09:25:21" ForumeurID="2" />
  7. <Messages messID="1237" Date="2005-07-2T09:26:42"  ForumeurID="2" />
  8. </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 :
  1. SELECT 1 as Tag, NULL as Parent, // Ici c'est le Tag 1 sans parent
  2.        f.ForumeurID as [Forumeurs!1!ForumeurID],//Noeud Forumeurs de tag 1 et correspondant à l'attribut ForumeurID
  3.        NULL as [Messages!2!messID]
  4. FROM Forumeurs f
  5. UNION ALL
  6. SELECT 2 as Tag, 1 as Parent,// Ici c'est le Tag 2 avec pour parent le Tag 1
  7.        f.ForumeurID as [Forumeurs!1!ForumeurID],
  8.        m.messID as [Messages!2!messID]
  9. FROM Forumeurs f INNER JOIN Messages m ON f.ForumeurID = m.ForumeurID
  10. ORDER BY [Forumeurs!1!ForumeurID], [Messages!2!messID]
  11. FOR XML EXPLICIT


 
Et en résultat:
 

Code :
  1. <Forumeurs  ForumeurID="1" >
  2. <Messages messID="1234">
  3. <Messages messID="1236">
  4. </Forumeurs>
  5. <Forumeurs   ForumeurID="2">
  6. <Messages messID="1235"  >
  7. <Messages messID="1237" >
  8. </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 :
  1. CREATE TABLE Messages
  2. {
  3. idMessage INT IDENTITY PRIMARY KEY,
  4. Contenu XML
  5. }


 
C'est cette ligne qui spécifie que nous avons à faire à du XML:

Code :
  1. Contenu XML


 
  Insertion des données:
 
 

Code :
  1. INSERT INTO Messages(Contenu)
  2. VALUES('<Mess>
  3.         <cat c="SGBD"/>
  4.         <sujet>SQL Server et le XML<sujet/>
  5.         </Mess>')


 
  SELECT:
 
On s'amuse avec XPATH:

Code :
  1. SELECT idMessage, Contenu.value('/Mess[1]/sujet[1]','varchar(80)')
  2. FROM Messages
  3. 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
Reply

Marsh Posté le 26-07-2005 à 10:24:04   

Reply

Marsh Posté le 26-07-2005 à 12:10:28    

Bravo,
Ce qui serait bien c'est que tu fasses une partie pour récupérer ton XML dans un fichier (avec la commande BCP par exemple) pour que ce dernier soit exploitable. Je peux t'aider si tu veux. ;-)

Reply

Marsh Posté le 26-07-2005 à 12:17:24    

madkane a écrit :

Bravo,
Ce qui serait bien c'est que tu fasses une partie pour récupérer ton XML dans un fichier (avec la commande BCP par exemple) pour que ce dernier soit exploitable. Je peux t'aider si tu veux. ;-)


 
 
Merci.
T'en fais pas ca viendra.

Reply

Marsh Posté le 26-07-2005 à 14:23:26    

Truc pour ou moins en rapport... L'autre jour, j'ai trouvé qu'on peut créer un document "tpl" contenant une page HTML (ou XML) template, et via une procédure, on peut générer, à intervals réguliers, des pages HTML résultat de la fusion de ce fichier TPL avec les résultats d'une série de requêtes.
 
Ca me semble carrément bien pour générer une version statique d'un site très lourd de contenu, sans pour autant coder une usinde à gaz pour mettre à jour les pages par la suite.
 
Seulement, j'ai fait ce qu'ils marquent dans l'exemple (que j'ai recopié en fait) et j'obtiens une erreur.
 
Je suis sous NT4, ça vient peut-être de là, mais bon... :??:

Reply

Marsh Posté le 26-07-2005 à 14:24:25    

Voir "sp_makewebtask"


Message édité par Arjuna le 26-07-2005 à 14:25:30
Reply

Marsh Posté le 26-07-2005 à 14:35:09    

En effet c'est vraiment pas mal comme truc....enfin ca a l'air.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed