对于 XML 路径:如何将属性和值保持在同一节点中
For XML Path: How to keep Attribute and Value in the same node
我在使用 FOR XML PATH
时遇到了一些问题。我的情况是:
我有 运行 脚本如下,属性 CCY
和 AMOUNT
的值合并到同一个节点:
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');
我在使用 FOR XML PATH
时遇到了一些问题。我的情况是:
我有 运行 脚本如下,属性 CCY
和 AMOUNT
的值合并到同一个节点:
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');