Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/11/2010, 22h21   #1
Invité de passage
 
Inscription : mars 2008
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 5
Points : 0
Points : 0
Par défaut Problème sur la génération d'un fichier XML

Bonjour,

j'aurais besoin de votre aide car je bloque actuellement sur la génération d'un fichier xml sur un sql serveur 2005.

Je dois générer (je ne vous mets qu'un extrait du fichier xml à générer)
quelque chose comme cà :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
<information client>
     <gerant>
          <nom>John Doe</nom>
          <Tel>0102030405</Tel>
     </gerant>
     <assistant>
          <nom>Martine</nom>
          <Tel>0102031122</Tel>
     <assistant>
</information client>
A savoir que ces informations sont dans 2 tables liables par une foreign key
- table gerant
- table assistant
via un code assistant dans la table gérant.

J'ai cherché des tutos expliquant l'utilisation de de XML PATH mais je n'arrive pas à obtenir ce qui m'es demandé dans les spécifications.

De plus je ne sais pas quelle démarche générale adopter pour le développement (je vais devoir récupérer les info depuis une 50aine de tables, le fichier xml fait 7-8 niveau).
Est ce que je doit générer une table unique contenant tout ce que je veux dans mon fichier, puis générer mon fichier xml,
oubien faire un datamart de plusieurs tables et générer un fichier xml à partir d'une requête tapant sur toute ces tables
ou faire plusieurs blocs xml et regrouper le tout à la fin (à savoir si il est possible de faire une jointure sur des blocs xml)

Merci d'avance pour votre aide
pMolik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 09h28   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 930
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 930
Points : 17 724
Points : 17 724
1) donnez des alias aux tables et colonnes qui correspondent à ce que vous attendez comme éléments.
2) forcez la directive elements
3) demandez à ajouter une racine
4) encapsulez des sous requêtes corrélées dans la requête principale pour l'imbrication des éléments XML.

Exemple :
Code :
1
2
3
4
5
6
SELECT name AS NOM, 
       (SELECT COUNT(*) 
        FROM   sys.COLUMNS 
        WHERE  object_id = MesTables.object_id) AS Nombre
FROM sys.TABLES AS MesTables
FOR XML AUTO, ELEMENTS, ROOT('toto')
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2010, 19h08   #3
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 720
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 720
Points : 6 840
Points : 6 840
Bonsoir,

N'est pas plutôt ce fichier xml que vous devez obtenir :

Code :
1
2
3
4
5
6
7
8
9
10
<information_client>
  <gerant>
    <nom>John Doe</nom>
    <tel>0102030405</tel>
    <assistant>
      <nom>Martine</nom>
      <tel>0102031122</tel>
    </assistant>
  </gerant>
</information_client>
++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2010, 20h14   #4
Invité de passage
 
Inscription : mars 2008
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 5
Points : 0
Points : 0
Bonjour à vous pour vos réponses.

J'ai donc essayé de suivre vos conseil mais je suis toujours bloqué.

Ci-joint un exemple de requête et ce que j'obtiens




Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
CREATE TABLE dbo.BilanPatrimoine(
	UserNum int NULL,
	libelle varchar(255) NULL,
	valeur int NULL,
	unite varchar(255) NULL)
 
 
 
CREATE TABLE dbo.user_1(
	Id int NULL)
 
 
INSERT INTO user_1 VALUES (1);
INSERT INTO user_1 VALUES (2);
 
INSERT INTO BilanPatrimoine VALUES  (1,'Libelle1',1233,'EUR');
INSERT INTO BilanPatrimoine VALUES  (1,'Libelle2',123,'EUR');
INSERT INTO BilanPatrimoine VALUES  (2,'Libelle1',1000,'EUR');
 
 
 
SELECT 
    '05/08/2010' AS "date",
    Id AS "logo",
    (SELECT (SELECT libelle AS "ligne/libelle",
    valeur AS "ligne/valeur",
    unite AS "ligne/unite"
    FROM BilanPatrimoine INNER JOIN user_1
    ON Id = UserNum 
    FOR xml path ('patrimoine'),type, elements)
    FOR xml path ('synthese'),type, elements)
    FROM user_1 
    FOR xml path ('doc'), root ('docs'), type,  elements

J'obtiens ceci
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<docs>
  <doc>
    <date_arrete>05/08/2010</date_arrete>
    <logo>1</logo>
    <synthese>
      <patrimoine>
        <ligne>
          <libelle>Libelle1</libelle>
          <valeur>1233</valeur>
          <unite>EUR</unite>
        </ligne>
      </patrimoine>
      <patrimoine>
        <ligne>
          <libelle>Libelle2</libelle>
          <valeur>123</valeur>
          <unite>EUR</unite>
        </ligne>
      </patrimoine>
      <patrimoine>
        <ligne>
          <libelle>Libelle1</libelle>
          <valeur>1000</valeur>
          <unite>EUR</unite>
        </ligne>
      </patrimoine>
    </synthese>
  </doc>
  <doc>
    <date_arrete>05/08/2010</date_arrete>
    <logo>2</logo>
    <synthese>
      <patrimoine>
        <ligne>
          <libelle>Libelle1</libelle>
          <valeur>1233</valeur>
          <unite>EUR</unite>
        </ligne>
      </patrimoine>
      <patrimoine>
        <ligne>
          <libelle>Libelle2</libelle>
          <valeur>123</valeur>
          <unite>EUR</unite>
        </ligne>
      </patrimoine>
      <patrimoine>
        <ligne>
          <libelle>Libelle1</libelle>
          <valeur>1000</valeur>
          <unite>EUR</unite>
        </ligne>
      </patrimoine>
    </synthese>
  </doc>
</docs>

alors que je m'attends à ce que ma jointure filtre pour chaque Id, les données associées.


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
<docs>
  <doc>
    <date_arrete>05/08/2010</date_arrete>
    <logo>1</logo>
    <synthese>
      <patrimoine>
        <ligne>
          <libelle>Libelle1</libelle>
          <valeur>1233</valeur>
          <unite>EUR</unite>
        </ligne>
        <ligne>
          <libelle>Libelle2</libelle>
          <valeur>123</valeur>
          <unite>EUR</unite>
        </ligne>
      </patrimoine>
    </synthese>
  </doc>
  <doc>
    <date_arrete>05/08/2010</date_arrete>
    <logo>2</logo>
    <synthese>
      <patrimoine>
        <ligne>
          <libelle>Libelle1</libelle>
          <valeur>1000</valeur>
          <unite>EUR</unite>
        </ligne>
      </patrimoine>
    </synthese>
  </doc>
</docs>


Pouvez vous m'expliquer pourquoi cela ne fonctionne pas ?

Merci d'avance pour votre aide, ma fin de dimanche en sera que meilleure
pMolik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2010, 20h16   #5
Invité de passage
 
Inscription : mars 2008
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 5
Points : 0
Points : 0
@mikedavem pour mon exemple précédent, je ne me suis pas trompé, je n'ai pas mis tout le xml attendu, il manque les niveaux supérieurs.
pMolik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2010, 21h07   #6
Invité de passage
 
Inscription : mars 2008
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 5
Points : 0
Points : 0
Finalement, j'ai trouvé ma réponse (:happy

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
SELECT 
	'05/08/2010' AS "date_arrete",
	Id AS "logo",
	(SELECT (SELECT (SELECT libelle AS "libelle",
	 valeur AS "valeur",
	 unite AS "unite"
	FROM BilanPatrimoine  
	WHERE  user1root.Id = UserNum 
	FOR xml path ('ligne'),type, elements)
	FOR xml path ('patrimoine'),type, elements)
	FOR xml path ('synthese'),type, elements)
		FROM user_1 AS user1root 
	FOR xml path ('doc'), root ('docs'), type,  elements
me génère bien ce que je voulais


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
<docs>
  <doc>
    <date_arrete>05/08/2010</date_arrete>
    <logo>1</logo>
    <synthese>
      <patrimoine>
        <ligne>
          <libelle>Libelle1</libelle>
          <valeur>1233</valeur>
          <unite>EUR</unite>
        </ligne>
        <ligne>
          <libelle>Libelle2</libelle>
          <valeur>123</valeur>
          <unite>EUR</unite>
        </ligne>
      </patrimoine>
    </synthese>
  </doc>
  <doc>
    <date_arrete>05/08/2010</date_arrete>
    <logo>2</logo>
    <synthese>
      <patrimoine>
        <ligne>
          <libelle>Libelle1</libelle>
          <valeur>1000</valeur>
          <unite>EUR</unite>
        </ligne>
      </patrimoine>
    </synthese>
  </doc>
</docs>
Je reviendrais vers vous si je galère encore......
pMolik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 11h21   #7
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 720
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 720
Points : 6 840
Points : 6 840
Vous avez plus simple (si jamais vous revenez voir le post )

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT 
	'05/08/2010' AS date_arret,
	U.id AS logo,
	(SELECT 
	  B1.libelle AS 'ligne/libelle',
	  B1.valeur AS 'ligne/valeur',
	  B1.unite AS 'ligne/unite'
	 FROM BilanPatrimoine AS B1
	 WHERE B1.UserNum = U.Id
	 FOR XML PATH(''), ROOT('patrimoine'), TYPE)
FROM BilanPatrimoine AS B
INNER JOIN user_1 AS U
ON U.Id = B.UserNum 
GROUP BY U.id
FOR XML PATH('doc'), ROOT('docs');
++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 19h53   #8
Invité de passage
 
Inscription : mars 2008
Messages : 5
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 5
Points : 0
Points : 0
Effectivement, c'est mieux et beaucoup plus propre comme requête.

Merci beaucoup pour votre aide.
pMolik est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h33.


 
 
 
 
Partenaires

Hébergement Web