Wie SQL Server 2005/2008 Spalten als identisch untergeordneten Knoten mit FOR XML-Abfrage zurückzukehren?

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

Frage

Im Grunde brauche ich einige Daten aus einer SQL Server-Tabelle in dem folgende XML-Format zurück:

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

Ich habe kommen mit der folgenden SQL-Anweisung:

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

Welche diese Ausgabe erzeugt:

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

Aber ich habe nicht weiter gekommen. Dank!

War es hilfreich?

Lösung 2

Vielen Dank Rob! Du hast mich auf jeden Fall auf dem richtigen Weg, +1 für Sie! Ich hatte alles in einem SELECT * FROM-Anweisung wickeln, sonst SQL Server beschwert. Hier ist die letzte Arbeits Abfrage:

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

Andere Tipps

Sie müssen Ihre Daten UNPIVOT.

Versuchen Sie es mit einer Unterabfrage entlang der Linien von:

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

oder etwas in diese Richtung ...

Ich habe nicht mit mir SQL (auf meinem iPhone heute), aber ich denke an:

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')
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top