如何在SQL Server 2005中使用for xml将列值用作xml元素名称?

tjm*_*ore 10 xml sql sql-server sql-server-2005

作为一个例子,简化我正在做的事情,说我有以下表格:

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)
Run Code Online (Sandbox Code Playgroud)

它简单地定义了一个可以是动态的元素名称表,并根据该表定义了一个值表.

我想要的是以下面的形式生成XML,其中@elements表的值成为元素名称,@ value表的值成为值.

<Customer>
    <FirstName>XXX</FirstName>
    <Surname>YYY</Surname>
    <Address>ZZZ<Address>
</Customer>
Run Code Online (Sandbox Code Playgroud)

然而,for xml到目前为止我的努力并不是那么顺利:

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

回报

<customer>
  <name>FirstName</name>
  <value>XXX</value>
  <name>Surname</name>
  <value>YYY</value>
  <name>Address</name>
  <value>ZZZ</value>
</customer>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

for xml raw 回报

<customer>
  <row name="FirstName" value="XXX" />
  <row name="Surname" value="YYY" />
  <row name="Address" value="ZZZ" />
</customer>
Run Code Online (Sandbox Code Playgroud)

有没有办法可以从列中获取值作为元素名称输出?我确定我在这里遗漏了一些显而易见的东西.

Chr*_*ler 14

这很好吃但是有效......

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

---结果---

<Customer>
  <FirstName>XXX</FirstName>
  <Surname>YYY</Surname>
  <Address>ZZZ</Address>
</Customer>
Run Code Online (Sandbox Code Playgroud)


Rem*_*anu 7

您正在尝试为可怕的语义数据库(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')
Run Code Online (Sandbox Code Playgroud)

  • @Marc:对.但这就是为什么EAV模型开始时这么糟糕的想法.SQL是一个关系系统,其中表有列.因此,将列存储为列,您将不会遇到此"问题";) (3认同)