SQL FOR XML使用值作为列名

时间:2014-06-27 09:03:41

标签: sql-server tsql for-xml

FOR XML命令使用列名来创建XML节点。我需要以我从数据库中获取的值命名我的节点。据我所知,你不能做像

这样的事情

SELECT Key AS Section

SECTION         | KEY                | VALUE
-----------------------------------------------------------
PageAddProduct  |   ErrorDateFormat  |  Incorrect value
PageAddProduct  |   ErrorNotSelected |  Please select value
WidgetLogin     |   Title            |  Connexion
WidgetLogin     |   MailLabel        |  Mail

这是所需的XML输出

<Resources>
  <WidgetLogin>
    <Title>Connexion</Title>
    <MailLabel>Mail</MailLabel>
  </WidgetLogin>
</Resources>

不确定是否可以使用For Xml获得此功能。非常感谢帮助。

2 个答案:

答案 0 :(得分:1)

您可以将XML构建为字符串,然后转换为XML。

此示例代码可以在SQL Server 2012中使用,因为它使用了concat函数,但可以轻松地重写它以使用+代替。

select cast(concat('<Resources>',
                   (
                   select concat('<',T1.SECTION,'>',
                                 (
                                 select concat('<',T2.[KEY],'>',
                                               (select T2.VALUE for xml path('')),
                                               '</',T2.[KEY],'>')
                                 from T as T2
                                 where T1.SECTION = T2.SECTION
                                 for xml path(''), type
                                 ).value('text()[1]', 'nvarchar(max)'),
                                 '</',T1.SECTION,'>')
                   from T as T1
                   group by T1.SECTION
                   for xml path(''), type
                   ).value('text()[1]', 'nvarchar(max)'),
                   '</Resources>') as xml)

SQL Fiddle

答案 1 :(得分:0)

您可以使用如下的FOR XML:

SELECT Section as Title, Value as MailLabel
FROM table
FOR XML PATH('WidgetLogin'), ROOT('Resources'), TYPE