2010-04-29 5 views
2

Comment obtenir une sortie comme suit en utilisant FOR XML/sql query. Je ne suis pas sûr comment je peux obtenir les valeurs de colonne en tant qu'éléments au lieu des noms de colonne des tables. J'utilise sql server 2005SERVEUR SQL POUR SYNTAXE XML

I HAVE TABLEAU Scema CE QUI SUIT

CREATE TABLE PARENT 
(
PID INT, 
PNAME VARCHAR(20) 
) 

CREATE TABLE CHILD 
(
PID INT, 
CID INT, 
CNAME VARCHAR(20) 
) 

CREATE TABLE CHILDVALUE 
(
CID INT, 
CVALUE VARCHAR(20) 
) 

INSERT INTO PARENT VALUES (1, 'SALES1') 
INSERT INTO PARENT VALUES (2, 'SALES2') 

INSERT INTO CHILD VALUES (1, 1, 'FOR01') 
INSERT INTO CHILD VALUES (1, 2, 'FOR02') 
INSERT INTO CHILD VALUES (2, 3, 'FOR03') 
INSERT INTO CHILD VALUES (2, 4, 'FOR04') 

INSERT INTO CHILDVALUE VALUES (1, '250000') 
INSERT INTO CHILDVALUE VALUES (2, '400000') 
INSERT INTO CHILDVALUE VALUES (3, '500000') 
INSERT INTO CHILDVALUE VALUES (4, '800000') 

La sortie Je cherche est la suivante

<SALE1> 
<FOR01>250000</FOR01> 
<FOR02>400000</FOR02> 
</SALE1> 
<SALE2> 
<FOR03>500000</FOR03> 
<FOR04>800000</FOR04> 
</SALE2> 

Répondre

0

En utilisant cette requête ici:

SELECT 
    p.PName '@Name', 
    (SELECT 
     c.CName AS '@Name', 
     (SELECT 
      cv.CValue AS 'Value' 
     FROM dbo.CHILDVALUE cv 
     WHERE cv.CID = c.CID 
     FOR XML PATH(''), TYPE 
     ) 
    FROM dbo.CHILD c 
    WHERE c.PID = p.PID 
    FOR XML PATH('Child'), TYPE 
    ) 
FROM  
    Parent p 
FOR 
    XML PATH('Node'), ROOT('Root') 

vous pouvez obtenir quelque chose comme ceci:

<Root> 
    <Node Name="SALES1"> 
    <Child Name="FOR01"> 
     <Value>250000</Value> 
    </Child> 
    <Child Name="FOR02"> 
     <Value>400000</Value> 
    </Child> 
    </Node> 
    <Node Name="SALES2"> 
    <Child Name="FOR03"> 
     <Value>500000</Value> 
    </Child> 
    <Child Name="FOR04"> 
     <Value>800000</Value> 
    </Child> 
    </Node> 
</Root> 

qui est probablement aussi proche de vos besoins que vous pouvez obtenir avec FOR XML PATH(), ROOT() etc.

+0

Merci pour la réponse. J'ai aussi pu obtenir quelque chose comme vous l'avez fait mais je voulais vraiment que les noms des colonnes soient des éléments. Donc ce que je demande n'est pas possible avec n'importe quelle syntaxe FOR XML? Aussi, je peux manipuler les tables dans une procédure stockée, utiliser en interne certaines tables temporaires, etc. mais je ne sais toujours pas comment obtenir le résultat dont j'ai besoin. – Raj73

+0

@ Raj73: de tout ce que je sais sur SQL Server et sa prise en charge FOR XML, ce que vous essayez de faire ne peut pas être accompli. Si vous n'êtes pas satisfait de ce résultat, vous devrez utiliser un langage de programmation tel que C# ou VB.NET ou quelque chose pour lire les données et afficher le XML. –

+0

merci, nous aurons un million de lignes et je ne voulais pas le tirer en utilisant C#/ado.net/linq pour générer et rendre le xml. J'avais l'intention d'exécuter la requête/Stored Proc à partir de la ligne de commande et de sortir le résultat sous forme de fichier xml. Peut-être que l'utilisation d'une lang de programmation est la seule façon que cela peut être fait. – Raj73

0

nœuds correspondent aux noms de champs. Donc, si vous voulez que vos noeuds primaires aient tous des noms différents (c'est-à-dire "<SALE1>", "<SALE2>", etc.), ils ne peuvent pas provenir de la même colonne.

Le format de sortie que vous avez demandé sera difficile à interroger des valeurs plus tard. (Par exemple, il vous empêchera de dire XPATH ou ce que vous avez à « regarder dans » un « champ » spécifique pour les valeurs)

Ce que vous devriez rechercher est le suivant:

<SALE> 
    <ID>1</ID> 
    <FOR> 
     <ID>1</ID> 
     <NUM>250000</NUM> 
    </FOR> 
    <FOR> 
     <ID>2</ID> 
     <NUM>400000</NUM> 
    </FOR> 
</SALE> 
<SALE> 
    <ID>2</ID> 
    <FOR> 
     <ID>3</ID> 
     <NUM>500000</NUM> 
    </FOR> 
    <FOR> 
     <ID>4</ID> 
     <NUM>800000</NUM> 
    </FOR> 
</SALE> 

Ou bien, une combinaison d'attributs & éléments comme celui-ci:

<SALE ID="1"> 
     <FOR ID="1"> 
      <NUM>250000</NUM> 
     </FOR> 
     <FOR ID="2"> 
      <NUM>400000</NUM> 
     </FOR> 
    </SALE> 
    <SALE ID="2"> 
     <FOR ID="3"> 
      <NUM>500000</NUM> 
     </FOR> 
     <FOR ID="4"> 
      <NUM>800000</NUM> 
     </FOR> 
    </SALE> 

Quoi qu'il en soit, regardez dans les livres en ligne pour SQL Server. Voici quelques idées: Auto XML, les éléments, la racine (« root ») BRUT etc ... XML

1

ne peut pas comprendre pourquoi chaque nœud a besoin d'une étiquette différente - qui ne sera pas tout amusant à interroger - mais de toute façon, vous pouvez le faire explicitement (sans FOR XML). Faites une boucle WHILE sur votre jeu d'enregistrements en incrémentant votre MIN (PID), et simplement SELECT '<' + PNAME + '>' et ainsi de suite

Il sera difficile de le formater afin qu'il soit lisible par l'homme comme les fichiers XML par défaut, mais il sera toujours lisible par n'importe quelle page Web, etc. Vous avez essayé de l'interroger.