Comment retourner SQL Server 2005/2008 colonnes en tant que nœuds enfants identiques en utilisant requête FOR XML?

StackOverflow https://stackoverflow.com/questions/2121740

Question

En fait, je dois retourner des données à partir d'une table SQL Server dans le format XML suivant:

<querydata>
  <entity name="Person.Contact">
    <row>
      <field name="FirstName">Gustavo</field>
      <field name="LastName">Achong</field>
    </row>
    <row>
      <field name="FirstName">Catherine</field>
      <field name="LastName">Abel</field>
    </row>
...
  </entity>
</querydata>

Je suis venu avec l'instruction SQL suivante:

select 'Person.Contact' as "@name", 
(select FirstName, LastName from Person.Contact for XML path('row'), TYPE)
for XML path('entity'), root('querydata')

qui produit cette sortie:

<querydata>
  <entity name="Person.Contact">
    <row>
      <FirstName>Gustavo</FirstName>
      <LastName>Achong</LastName>
    </row>
    <row>
      <FirstName>Catherine</FirstName>
      <LastName>Abel</LastName>
    </row>
....
  </entity>
</querydata>

Mais je n'obtenu plus loin. Merci!

Était-ce utile?

La solution 2

Merci Rob! Vous avez certainement me sur la bonne voie, +1 pour vous! Je devais tout envelopper dans un SELECT * FROM, sinon serveur SQL se plaint. Voici la requête de travail final:

SELECT 'Person.Contact' as "@name",
(SELECT 
    (SELECT * from (SELECT 'FirstName' as [@name], [FirstName] as [*]
    union all
    SELECT 'LastName' as [@name], [LastName] as [*]) y
    for xml path('field'), TYPE)
from Person.Contact for XML path, TYPE)
for XML path('entity'), root('querydata')

Autres conseils

Vous devez UNPIVOT vos données.

Essayez d'utiliser un sous-requête le long des lignes de:

SELECT 'FirstName' as [@name], FirstName as [*]
union all
SELECT 'LastName' as [@name], LastName as [*]
for xml path('field')

Ou quelque chose dans ce sens ...

Je n'ai pas SQL avec moi (sur mon iPhone aujourd'hui), mais je pense à:

select 'Person.Contact' as "@name", 
(select (SELECT 'FirstName' as [@name], FirstName as [*]
union all
SELECT 'LastName' as [@name], LastName as [*]
for xml path('field')) from Person.Contact for XML path('row'), TYPE)
for XML path('entity'), root('querydata')
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top