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

时间:2018-05-12 12:54:35

标签: sql xml for-xml-path

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

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

  

脚本1:

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

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

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

脚本2:我将Foo的顺序更改为中间,结果是   错

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>

所以我的问题是:如何将它们保存在同一节点中而不将它们放在一起。感谢

1 个答案:

答案 0 :(得分:1)

这是为了工作......

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

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

尝试一下:

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

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