2016-10-26 1 views
1

Je suis nouveau lors de la création d'un fichier XML à l'aide du serveur SQL. J'ai 2 tables; 1 pour les personnes et l'autre avec les paramètres par défaut pour eux.Requête SQL Server pour les paires de valeurs de nom

Personne Table:

ABC 
DEF 

Réglages table:

Code   name     value   
----------------------------------------- 
Hair   Hair color   Brown     
Hair   Texture    Curly    
Shoes   Shoe size   6    
Shoes   Shoe color   White  

Comment puis-je créer une paire de valeurs de nom qui ressemble à ceci? Lorsque je tente d'obtenir les paramètres, j'ai reçu une erreur au sujet de plusieurs enregistrements:

<PersonData> 
    <Person>ABC</Person> 
    <DefaultSettings> 
     <Code>Hair</Code> 
     <settings> 
     <name>Hair color</name> 
     <value>Brown</value> 
     </settings> 
     <settings> 
     <name>Texture</name> 
     <value>Curly</value> 
     </settings> 
     <Code>Shoes</Code> 
     <settings> 
     <name>Shoe size</name> 
     <value>6</value> 
     </settings> 
     <settings> 
     <name>Shoe color</name> 
     <value>White</value> 
     </settings> 
    </DefaultSettings> 
    </Person> 
    <Person>DEF</Person> 
    <DefaultSettings> 
     <Code>Hair</Code> 
     <settings> 
     <name>Hair color</name> 
     <value>Brown</value> 
     </settings> 
     <settings> 
     <name>Texture</name> 
     <value>Curly</value> 
     </settings> 
     <Code>Shoes</Code> 
     <settings> 
     <name>Shoe size</name> 
     <value>6</value> 
     </settings> 
     <settings> 
     <name>Shoe color</name> 
     <value>White</value> 
     </settings> 
    </DefaultSettings> 
    </Person> 
</PersonData> 
+0

vous avez google 'Pour XML Sql Server'? Montrez du code que vous avez essayé et dites pourquoi cela n'a pas fonctionné – dfundako

+0

Cela n'a aucun sens. Toutes les personnes obtiennent les mêmes paramètres? Un code de réglage représente plusieurs valeurs? –

+0

Vous XML n'est pas valide. Vous fermez la balise '' derrière le nom de la personne, puis à nouveau après la fermeture '/ '. S'il vous plaît réparer votre sortie attendue ... – Shnugo

Répondre

1

Comme dit dans mon commentaire votre XML donné n'est pas valide. La requête suivante se rapproche de la sortie demandée. En espérant que mon ampoule de verre magique fonctionne toujours:

DECLARE @personTable TABLE(ID INT IDENTITY, Name VARCHAR(100)); 
INSERT INTO @personTable VALUES 
('ABC'),('DEF'); 

DECLARE @defaultSettings TABLE(Code VARCHAR(100),name VARCHAR(100),value VARCHAR(100));   
INSERT INTO @defaultSettings VALUES 
('Hair','Hair color','Brown')     
,('Hair','Texture','Curly')   
,('Shoes','Shoe size','6')    
,('Shoes','Shoe color','White'); 

SELECT pd.ID AS [Person/@id] 
     ,pd.Name AS [Person/@name] 
     ,(
     SELECT ds.Code 
       ,(
       SELECT ds2.name 
         ,ds2.value 
       FROM @defaultSettings AS ds2 
       WHERE ds.Code=ds2.Code 
       FOR XML PATH('settings'),TYPE 
       ) 
     FROM @defaultSettings AS ds 
     GROUP BY ds.Code 
     FOR XML PATH(''),TYPE 
     ) AS [Person/DefaultSettings] 
FROM @personTable AS pd 
FOR XML PATH(''),ROOT ('PersonData') 

Le résultat

<PersonData> 
    <Person id="1" name="ABC"> 
    <DefaultSettings> 
     <Code>Hair</Code> 
     <settings> 
     <name>Hair color</name> 
     <value>Brown</value> 
     </settings> 
     <settings> 
     <name>Texture</name> 
     <value>Curly</value> 
     </settings> 
     <Code>Shoes</Code> 
     <settings> 
     <name>Shoe size</name> 
     <value>6</value> 
     </settings> 
     <settings> 
     <name>Shoe color</name> 
     <value>White</value> 
     </settings> 
    </DefaultSettings> 
    </Person> 
    <Person id="2" name="DEF"> 
    <DefaultSettings> 
     <Code>Hair</Code> 
     <settings> 
     <name>Hair color</name> 
     <value>Brown</value> 
     </settings> 
     <settings> 
     <name>Texture</name> 
     <value>Curly</value> 
     </settings> 
     <Code>Shoes</Code> 
     <settings> 
     <name>Shoe size</name> 
     <value>6</value> 
     </settings> 
     <settings> 
     <name>Shoe color</name> 
     <value>White</value> 
     </settings> 
    </DefaultSettings> 
    </Person> 
</PersonData> 
+0

Merci, Shnugo! je vais essayer ça. Je sais que les données n'ont pas de sens, mais c'est un modèle pour être discret. Je dois convertir les données selon les spécifications du fournisseur. Ceci est une section du total PersonData. La requête peut-elle être incorporée dans une autre requête? – okidog

+0

@okidog La requête est entièrement * ad-hoc * et donc facile à intégrer dans une autre requête. Pensez à l'expression entière pour renvoyer une valeur scalaire. Il suffit de mettre le paranthésis autour et l'ajouter à la liste des colonnes d'un select. – Shnugo

+0

Cela fonctionne très bien! J'ai juste besoin de comprendre comment se débarrasser des espaces de noms. Merci beaucoup! – okidog