【问题标题】:creating XML elements and values from table data从表数据创建 XML 元素和值
【发布时间】:2014-09-01 08:22:45
【问题描述】:

我有一个存储数据的表:

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

你能帮忙吗?谢谢!

【问题讨论】:

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


    【解决方案1】:

    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>
    

    【讨论】:

    【解决方案2】:

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

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

    这会给你&lt;val&gt;value 3 &amp;lt;&amp;gt;&lt;/val&gt;,但你可以用替换去掉&lt;val&gt;标签:

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

    【讨论】:

      【解决方案3】:

      如果您使用的是 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

      【讨论】:

      • 其中一个列值成为元素名称。你的方法行不通,试试看。
      猜你喜欢
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多