【问题标题】:SQL FOR XML use values as column namesSQL FOR XML 使用值作为列名
【发布时间】:2014-06-27 09:03:41
【问题描述】:

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

之类的事情

选择键作为部分

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 获得此功能。非常感谢您的帮助。

【问题讨论】:

    标签: sql-server tsql for-xml


    【解决方案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

    【讨论】:

      【解决方案2】:

      您可以像下面这样使用 FOR XML:

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

      【讨论】:

      • 这将专门用于“WidgetLogin”部分,我可能有数百个部分和值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多