我在表格中有一个空字符串,我选择使用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>
*/
谢谢!
答案 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>
我认为这与元素名称的长度无关。它也不会与您调用的列数相关联。这仅限于: 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');