Comment retourner SQL Server 2005/2008 colonnes en tant que nœuds enfants identiques en utilisant requête FOR XML?
-
22-09-2019 - |
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!
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