对于 xml path('') 输出

kev*_*hat 9 sql-server t-sql

当我运行以下

select t.type
  from (values ('Green'),('Blue'),('Red')) as t(type)
   for xml path('')
Run Code Online (Sandbox Code Playgroud)

我收到这个输出

<type>Green</type>
<type>Blue</type>
<type>Red</type>
Run Code Online (Sandbox Code Playgroud)

如果我运行以下

select t.type + '/'
  from (values ('Green'),('Blue'),('Red')) as t(type)
   for xml path('')
Run Code Online (Sandbox Code Playgroud)

我收到这个输出

Green/Blue/Red/
Run Code Online (Sandbox Code Playgroud)

为什么在select中添加连接会导致xml文件中一行的type标签和输出被删除?运行 SQL Server 2012。

Eri*_*ing 15

XML 是疯子

添加串联字符串时,您将丢失“路径元素”。

例如,如果您这样做:

SELECT t.type + '/' AS type
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML PATH('');

SELECT t.type + '/' 
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML PATH('type');
Run Code Online (Sandbox Code Playgroud)

你得到这个:

<type>Green/</type>
<type>Blue/</type>
<type>Red/</type>
Run Code Online (Sandbox Code Playgroud)

列名或别名充当路径元素。

其他一些可能有帮助的例子

使用 RAW, ELEMENTS

SELECT t.type + '/'
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML RAW, ELEMENTS;

SELECT t.type + '/' AS type
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML RAW, ELEMENTS;
Run Code Online (Sandbox Code Playgroud)

在第一个示例中,您获得了通用的“row”元素名称,但在第二个示例中,您获得了 row/type。

使用时RAW, TYPE

SELECT t.type + '/' AS type
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML RAW, TYPE;

SELECT t.type + '/'
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML RAW, TYPE;
Run Code Online (Sandbox Code Playgroud)

第一个查询返回有效的 XML,第二个查询抛出错误,因为路径元素缺少标识符。

使用AUTO,表别名和列名变成路径:

SELECT type + '/' AS type
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML AUTO;

SELECT type 
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML AUTO;
Run Code Online (Sandbox Code Playgroud)

但是如果没有别名,您会收到类似的错误:

SELECT type + '/'
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML AUTO;
Run Code Online (Sandbox Code Playgroud)

我会举一个例子,FOR XML EXPLICIT但我现在开始喝酒是不负责任的。