【问题标题】:For XML Path: How to keep Attribute and Value in the same node对于 XML 路径:如何将属性和值保持在同一个节点中
【发布时间】:2018-05-12 12:54:34
【问题描述】:

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

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

脚本 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>

脚本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>

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

【问题讨论】:

    标签: sql xml for-xml-path


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

    【讨论】:

    • 谢谢先生。顺序很重要:)
    【解决方案2】:

    使用跟随,选择顺序很重要。

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

    参考工作example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      • 2020-12-15
      相关资源
      最近更新 更多