是否有可以添加具有任意值的属性的 FOR XML 变体?

Jef*_*der 4 xml sql-server

我正在尝试创建一个类似于此的查询

SELECT
'foo' AS Detail,
'bar' AS Detail,
'baz' AS Detail
FOR XML PATH ('Header')
Run Code Online (Sandbox Code Playgroud)

生产这样的东西——

<Header>
  <Detail type="A">foo</Detail>
  <Detail type="B">bar</Detail>
  <Detail type="C">baz</Detail>
</Header>
Run Code Online (Sandbox Code Playgroud)

并且似乎无法在不将列值分配给属性的情况下创建属性。

Mik*_*son 6

你的查询

SELECT
'foo' AS Detail,
'bar' AS Detail,
'baz' AS Detail
FOR XML PATH ('Header')
Run Code Online (Sandbox Code Playgroud)

将值连接到单个Detail元素。

<Header>
  <Detail>foobarbaz</Detail>
</Header>
Run Code Online (Sandbox Code Playgroud)

要拥有多个Detail元素,您需要使用null.

SELECT
'foo' AS Detail,
 null,
'bar' AS Detail,
 null,
'baz' AS Detail
FOR XML PATH ('Header')
Run Code Online (Sandbox Code Playgroud)
<Header>
  <Detail>foo</Detail>
  <Detail>bar</Detail>
  <Detail>baz</Detail>
</Header>
Run Code Online (Sandbox Code Playgroud)

然后您使用Rob Farley@答案中建议的语法来获得您正在寻找的结果。

SELECT
'A' AS 'Detail/@type', 
'foo' AS Detail,
 null,
'B' AS 'Detail/@type', 
'bar' AS Detail,
 null,
'C' AS 'Detail/@type', 
'baz' AS Detail
FOR XML PATH ('Header')
Run Code Online (Sandbox Code Playgroud)
<Header>
  <Detail type="A">foo</Detail>
  <Detail type="B">bar</Detail>
  <Detail type="C">baz</Detail>
</Header>
Run Code Online (Sandbox Code Playgroud)


Rob*_*ley 3

尝试命名您的列[@type]

多行也可能有帮助。就像是:

SELECT 'A' as [@type], 'foo'
UNION ALL
SELECT 'B' as [@type], 'bar'
UNION ALL
SELECT 'C' as [@type], 'baz'
FOR XML PATH('Detail'), ROOT('Header');
Run Code Online (Sandbox Code Playgroud)