【问题标题】:Structuring XML using FOR XML使用 FOR XML 构建 XML
【发布时间】:2013-12-30 17:00:47
【问题描述】:

我正在尝试使用FOR XML 从 SQL 查询中返回 XML,而且我快到了,但似乎我无法将它转换为我需要的确切格式。

这是我目前构建的语句:

SELECT TOP 1 
  ID AS '@id'
  ,1 AS '@version'
  ,'en' AS '@lang'
  ,'Joe Smith' AS 'field/Name'
  ,'email@add.com' AS 'field/Email' 
FROM Table
FOR XML PATH ('add')

它返回的 XML 格式:

<add id="123" version="1" lang="en">
  <field>
    <Name>Joe Smith</Name>
    <Email>email@add.com</Email>
  </field>
</add>

我需要它如何返回:

<add id="123" version="1" lang="en">
  <field name="Name">Joe Smith</field>
  <field name="Email">email@add.com</field>
</add>

如何做到这一点,到目前为止,这是我在网上找到的文档中得到的最远距离。请帮忙。

【问题讨论】:

  • 这是为一个,但问题是不能将它用于两个,因为不能重复列名,'fieldName' as 'field/@name',[table].[colX] as 'field '

标签: sql sql-server sql-server-2008 tsql for-xml


【解决方案1】:

1)

SELECT TOP 1 
  ID AS '@id'
  ,1 AS '@version'
  ,'en' AS '@lang'
  ,(
    SELECT  x.Attribute AS  '@name',
            x.Value     AS  'text()'
    FROM    (VALUES (N'Name', N'Joe Smith'), (N'Email', N'email@add.com')) x(Attribute,Value)
    FOR XML PATH('field'), TYPE
  )
FROM (SELECT 1 ID) AS Table1
FOR XML PATH ('add')

2) 第二种解决方案使用 模板 和变量。我提出这个解决方案是因为我看到了TOP 1(最多一行)。首先,您应该将该行中的值转换为变量 (SELECT @Variable = Column, ... FROM Table)。您拥有更大的灵活性,但性能可能会受到影响(注意:我没有进行任何测试)。

DECLARE 
    @ID INT = 1,
    @Version INT = 1,
    @Lang NVARCHAR(10) = N'en',
    @Name NVARCHAR(50) = N'Joe Smith',
    @Email NVARCHAR(100) = N'email@add.com'

DECLARE @x XML = N'';
SELECT @x.query(N'
<add id="{sql:variable("@ID")}" version="{sql:variable("@Version")}" lang="{sql:variable("@Lang")}">
  <field name="Name">{sql:variable("@Name")}</field>
  <field name="Email">{sql:variable("@Email")}</field>
</add>
');

【讨论】:

  • 谢谢,但是对于您的第二个解决方案,如果结果不仅仅是 1 行,我是否需要设置一个游标或其他东西来遍历每一行? (TOP 1)
  • @ZeeTee:如果您有很多行(不是TOP 1),那么第二个脚本不是解决方案。改用第一个解决方案。
猜你喜欢
  • 2023-03-07
  • 1970-01-01
  • 2014-12-19
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多