从表数据创建XML元素和值

时间:2014-09-01 08:22:45

标签: sql-server xml sql-server-2008-r2

我有一个存储数据的表:

declare @t table
    (
        el nvarchar(50), 
        val nvarchar(50)
    )
insert into @t values ('n1', 'value 1'), ('n2', 'value 2'), ('n3', 'value 3 <>')

我应该得到xml,看起来像这样:

<data>
  <n1>value 1</n1>
  <n2>value 2</n2>
  <n3>value 3 &lt;&gt;</n3>
</data>
到目前为止我能得到的最好的是:

select cast('<' + el + '>' +  (select val from @t i where i.el = t.el for xml raw(''), elements)  + '</' + el + '>'  as xml)
from @t t
For XML Raw(''), root('data'), Elements, Type
你可以帮忙吗?谢谢!

3 个答案:

答案 0 :(得分:2)

无需加入el,您可以使用*删除标记名val

select cast('<'+el+'>'+(select val as '*' for xml path(''))+'</'+el+'>' as xml)
from @T
for xml path(''), root('data')

结果:

<data>
  <n1>value 1</n1>
  <n2>value 2</n2>
  <n3>value 3 &lt;&gt;</n3>
</data>

答案 1 :(得分:2)

您可以将val属性转换为XML:

cast((select val for xml path(''), type) as nvarchar(max))

这将为您提供<val>value 3 &lt;&gt;</val>,但您可以使用替换删除<val>代码:

select  cast('<' + el + '>' + 
        replace(replace(
            cast((select val for xml path(''), type) as nvarchar(max)), 
            '<val>', ''), '</val>', '') +
        '</' + el + '>' as xml)
from    @t
for     xml path(''), root('data')

答案 2 :(得分:0)

如果您使用的是SQL Server 2012,则可以尝试使用XML PATH

    SELECT TOP 1000 FirstName, LastName
  FROM [AdventureWorks2012].[Person].[Person]
  where FirstName like 'Ken%'
  and BusinessEntityID like '1514%'
  FOR XML PATH

输出

<row>
  <FirstName>Kendra</FirstName>
  <LastName>Alonso</LastName>
</row>
<row>
  <FirstName>Kendra</FirstName>
  <LastName>Moreno</LastName>
</row>
<row>
  <FirstName>Kendra</FirstName>
  <LastName>Munoz</LastName>
</row>
<row>
  <FirstName>Kendra</FirstName>
  <LastName>Romero</LastName>
</row>

有关更多示例,请参阅 http://msdn.microsoft.com/en-us/library/bb510462.aspx