Как использовать значения столбцов в качестве имен элементов XML, используя для XML в SQL Server 2005? - PullRequest
9 голосов
/ 13 июля 2010

Упрощение того, что я делаю, например, скажем, у меня есть следующие таблицы:

declare @elements table (id int, name nvarchar(20))

insert into @elements (id, name) values (1, 'FirstName')
insert into @elements (id, name) values (2, 'Surname')
insert into @elements (id, name) values (3, 'Address')

declare @values table (id int, value nvarchar(20), elementId int)

insert into @values (id, value, elementId) values (1, 'XXX', 1)
insert into @values (id, value, elementId) values (2, 'YYY', 2)
insert into @values (id, value, elementId) values (3, 'ZZZ', 3)

, которая просто определяет таблицу имен элементов, которая может быть динамической, для которой определяется таблица значений.

Я хотел бы создать XML в следующей форме, где значения таблицы @elements становятся именами элементов, а значения таблицы @values ​​становятся значениями.

<Customer>
    <FirstName>XXX</FirstName>
    <Surname>YYY</Surname>
    <Address>ZZZ<Address>
</Customer>

Однако мои усилия с for xml пока идут не очень хорошо:

select e.name, v.value from @elements e
inner join @values v on v.elementId = e.id
for xml path(''), root('customer')

возвращает

<customer>
  <name>FirstName</name>
  <value>XXX</value>
  <name>Surname</name>
  <value>YYY</value>
  <name>Address</name>
  <value>ZZZ</value>
</customer>

for xml auto возвращает

<customer>
  <e name="FirstName">
    <v value="XXX" />
  </e>
  <e name="Surname">
    <v value="YYY" />
  </e>
  <e name="Address">
    <v value="ZZZ" />
  </e>
</customer>

for xml raw возвращает

<customer>
  <row name="FirstName" value="XXX" />
  <row name="Surname" value="YYY" />
  <row name="Address" value="ZZZ" />
</customer>

Есть ли способ получить значения из столбца для вывода в виде имен элементов? Я уверен, что упускаю что-то явно простое здесь.

Ответы [ 2 ]

13 голосов
/ 24 мая 2011

Это сыро, но работает ...

select 
  cast('<' + name + '>' + value + '</' + name + '>' as xml) 
from @values v 
join @elements e on v.id = e.id     
for xml path(''), root('Customer')

--- результаты ---

<Customer>
  <FirstName>XXX</FirstName>
  <Surname>YYY</Surname>
  <Address>ZZZ</Address>
</Customer>
7 голосов
/ 13 июля 2010

Вы пытаетесь смоделировать страшную семантическую базу данных (Entity-Attribute-Value). Прочтите эту статью, чтобы хотя бы начать работать по правильному пути: Рекомендации по моделированию семантических данных для производительности и масштабируемости

Технически, это запрос, который вы ищете:

select * from (
select name, value
from @values v
join @elements e on v.id = e.id) ve
pivot (max(value)
for name in ([FirstName], [Surname], [Address])) as p
for xml path('Customer')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...