Cómo devolver SQL Server 2005/2008 columnas como nodos secundarios idénticos mediante consulta FOR XML?

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

Pregunta

Básicamente necesito devolver algunos datos de una tabla de SQL Server en el siguiente formato XML:

<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>

Me han llegado con la siguiente instrucción SQL:

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

¿Qué produce esta salida:

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

Sin embargo, he llegado más lejos. Gracias!

¿Fue útil?

Solución 2

Muchas gracias Rob! Definitivamente me tienes en el camino correcto, 1 para usted! Tuve que envolver todo en un SELECT * FROM, de lo contrario el servidor SQL se queja. Ésta es la consulta de trabajo 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')

Otros consejos

Es necesario UNPIVOT sus datos.

Trate de usar una sub consulta en la línea de:

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

O algo en este sentido ...

No tengo SQL conmigo (en mi iPhone en la actualidad), pero estoy pensando en:

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')
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top