Как вернуть столбцы SQL Server 2005/2008 как идентичные дочерние узлы с помощью запроса FOR XML?
-
22-09-2019 - |
Вопрос
По сути, мне нужно вернуть некоторые данные из таблицы 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 вам!Пришлось все обернуть в оператор 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')
Другие советы
Вам нужно отключить данные.
Попробуйте использовать подзапрос типа:
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')
Не связан с StackOverflow