对于 XML 路径:如何将属性和值保持在同一节点中

For XML Path: How to keep Attribute and Value in the same node

我在使用 FOR XML PATH 时遇到了一些问题。我的情况是:

我有 运行 脚本如下,属性 CCYAMOUNT 的值合并到同一个节点:

Script 1:

SELECT 'USD' AS 'Amount/@Ccy',
       123000 AS Amount,
       'Foo' AS Foo
FOR XML PATH('root'), TYPE;

结果1:root节点中只有1个AMOUNT节点

<root>
  <Amount Ccy="USD">123000</Amount>
  <Foo>Foo</Foo>
</root>

Script 2: I change the order of Foo to the middle, and the result is wrong

SELECT 'USD' AS 'Amount/@Ccy',
       'Foo' AS Foo,
       123000 AS Amount
FOR XML PATH('root'), TYPE;

结果2:根节点中有2个节点AMOUNT

<root>
  <Amount Ccy="USD" />
  <Foo>Foo</Foo>
  <Amount>123000</Amount>
</root>

所以我的问题是:如何在不将它们放在一起的情况下将它们保持在同一个节点中。谢谢

使用以下内容,Select顺序很重要。

SELECT 'USD' AS 'Amount/@Ccy',123000 AS Amount,
   'Foo' AS Foo FOR XML PATH('root'), TYPE;

参考工作example

这是为了工作...

引擎沿着列列表向下移动,打开一个元素,填充嵌套元素,找到一个新元素(哦!我必须关闭最后一个!)...等等。

属性 必须 在包含元素 之前 声明。顺序很重要!

试试看:

--同名:你可能会感到惊讶

SELECT 1 AS [SomeElement]
      ,2 AS [SomeElement]
FOR XML PATH('SomeTag'),ROOT('root');

--两者之间的不同名称

SELECT 1 AS [SomeElement]
      ,'in between' AS [SomeOther]
      ,2 AS [SomeElement]
FOR XML PATH('SomeTag'),ROOT('root');

--不同的元素 - 嗯 - 不存在(你也可以使用 NULL)

SELECT 1 AS [SomeElement]
      ,''
      ,2 AS [SomeElement]
FOR XML PATH('SomeTag'),ROOT('root');

--你觉得这里会出现什么?

SELECT 'blah' AS [SomeElement/@TheAttribute]
      ,1 AS [SomeElement]
      ,2 AS [SomeElement]
FOR XML PATH('SomeTag'),ROOT('root');

--...还有这里?

SELECT 'blah' AS [SomeElement/@TheAttribute]
      ,1 AS [SomeElement]
      ,''
      ,'blub' AS [SomeElement/@TheAttribute]
      ,2 AS [SomeElement]
FOR XML PATH('SomeTag'),ROOT('root');

--这是 - 最后 - 你的例子(原则上)

SELECT 1 AS [SomeElement]
      ,'in between' AS [SomeOther]
      ,'blub' AS [SomeElement/@TheAttribute]
FOR XML PATH('SomeTag'),ROOT('root');

-- 而且 - 只是为了好玩! - 也试试这个

SELECT 1 AS [SomeElement]
      ,NULL
      ,'blub' AS [SomeElement/@TheAttribute]
FOR XML PATH('SomeTag'),ROOT('root');