Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1879 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  SQL Server et le XML

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

SQL Server et le XML

n°1159824
cesarr89
Posté le 26-07-2005 à 10:24:04  profilanswer
 

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
mood
Publicité
Posté le 26-07-2005 à 10:24:04  profilanswer
 

n°1160010
madkane
Posté le 26-07-2005 à 12:10:28  profilanswer
 

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. ;-)

n°1160044
cesarr89
Posté le 26-07-2005 à 12:17:24  profilanswer
 

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.

n°1160266
Arjuna
Aircraft Ident.: F-MBSD
Posté le 26-07-2005 à 14:23:26  profilanswer
 

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... :??:

n°1160267
Arjuna
Aircraft Ident.: F-MBSD
Posté le 26-07-2005 à 14:24:25  profilanswer
 

Voir "sp_makewebtask"


Message édité par Arjuna le 26-07-2005 à 14:25:30
n°1160288
cesarr89
Posté le 26-07-2005 à 14:35:09  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  SQL Server et le XML

 

Sujets relatifs
[SQL] Problème écriture requête[Article] SQL Server : Eviter les colonnes calculées comme la peste
Pb de calcul avec une requête SQL[Résolu] Condition+SQL
[SQL]fonction de comparaison de chainesSGBD / ASP : Page tester des procédures stockées SQL Server depuis ASP
PHP fait n'importe quoi avec les XML dès qu'ils dépassent 200 ko ?[XML]-[XSL] JS
SQL vers XML sous SQL ServerImporter fichier XML dans des tables SQL Server 2000
Plus de sujets relatifs à : SQL Server et le XML


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR