一尘不染

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

sql

使用时出现一些问题FOR XML PATH。我的情况是:

我已经如下运行脚本,属性CCY和的值AMOUNT被合并到同一节点:

脚本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:AMOUNT根节点中有2个节点

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

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


阅读 184

收藏
2021-03-08

共1个答案

一尘不染

这意味着它可以工作…

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

必须 在contains 元素之前 声明一个属性。顺序很重要!

试试看:

-相同的名称:您可能会感到惊讶

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');
2021-03-08