Как вернуть столбцы SQL Server 2005/2008 как идентичные дочерние узлы, используя запрос FOR XML? - PullRequest
1 голос
/ 23 января 2010

В основном мне нужно вернуть некоторые данные из таблицы SQL Server в следующем формате 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>

Я предложил следующий оператор SQL:

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

Который производит этот вывод:

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

Но я не получил больше. Спасибо!

Ответы [ 2 ]

1 голос
/ 23 января 2010

Вам необходимо отключить ваши данные.

Попробуйте использовать подзапрос, например:

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

Или что-то в этом роде ...

У меня нет SQL (на моем iPhone сегодня), но я думаю о:

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')
0 голосов
/ 23 января 2010

Большое спасибо, Роб! Вы определенно сделали меня на правильном пути, +1 для вас! Мне пришлось обернуть все в инструкции SELECT * FROM, в противном случае сервер SQL жалуется. Вот последний рабочий запрос:

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