Sql2012 FOR XML不一致的“空元素”行为

时间:2016-10-14 16:06:35

标签: sql sql-server xml tsql

我在表格中有一个空字符串,我选择使用XML。理想情况下,这会生成一个空元素,例如<name />而不是<name></name>

似乎如果我的空字符串是我选择的唯一内容,我会得到不需要的(详细的)空标记...但如果我选择其他内容,包括另一个空字符串(或相同的空字符串),我得到理想的空标签()。

谁能告诉我为什么会这样?更重要的是,如何控制它?

declare @table table( TextValue nvarchar(100) )
insert into @table( TextValue ) values ( '' )

select
    ( select t.TextValue name for xml path( '' ), type )
from @table t
for xml path( 'row' ), root( 'root' ), type
/* result:
<root>
  <row>
    <name></name> <!-- select just once, verbose -->
  </row>
</root> 
*/

select
    ( select t.TextValue name for xml path( '' ), type ),
    ( select t.TextValue name for xml path( '' ), type )
from @table t
for xml path( 'row' ), root( 'root' ), type
/* result:
<root>
  <row>
    <name /> <!-- select twice, nice and neat -->
    <name />
  </row>
</root>
*/

谢谢!

1 个答案:

答案 0 :(得分:1)

这让我很好奇:

这就是我提出的:

如果您告诉XML引擎创建 XML,则按照

的方式完成
  • 打开元素
  • 填写内容
  • 关闭元素

所有这些示例都会导致<element></element>

select '' name
for xml path( 'row' )

select '' name
      ,'' name2       
for xml path( 'row' )

select '' name
      ,''
      ,'' name 
for xml path( 'row' )

但是如果在XML引擎处理它之前 创建了XML-elment,那么就会使用(更好的)短格式。

所有这些都导致<element/>

select CAST('<name></name>' AS XML)
for xml path( 'row' )

select CAST('<name/>' AS XML)
for xml path( 'row' )

select (SELECT '' AS name FOR XML PATH(''),TYPE)
for xml path( 'row' )

更新

你甚至可以结合这个

select (SELECT '' AS name FOR XML PATH(''),TYPE)
       ,'' AS name
for xml path( 'row' )

导致

<row>
  <name />
  <name></name>
</row>

更新2

我认为这与元素名称的长度无关。它也不会与您调用的列数相关联。这仅限于: XML是创建的 还是之前创建

DECLARE @n1 VARCHAR(100)='';
DECLARE @n2 XML='<name></name>';
DECLARE @n3 XML='<name/>';

SELECT @n1 AS name FOR XML PATH('root');
SELECT @n2 FOR XML PATH('root');
SELECT @n3 FOR XML PATH('root');