为什么STUFF删除XML?

时间:2015-05-16 09:22:54

标签: sql sql-server

请参阅下面的DDL:

create table #Test (id int,Name varchar(30))

insert into #Test values (1,'Ian')
insert into #Test values(1,'Mark')
insert into #Test values(2,'James')
insert into #Test values(3,'Karen')
insert into #Test values(3,'Suzie')

和下面的SQL:

select * from #Test for xml path('')

返回:

<id>1</id>
<Name>Ian</Name>
<id>1</id>
<Name>Mark</Name>
<id>2</id>
<Name>James</Name>
<id>3</id>
<Name>Karen</Name>
<id>3</id>
<Name>Suzie</Name>

这是我所期待的。现在看下面的SQL:

SELECT distinct ID,
STUFF( (select ','+ NAME from #Test as #Test1 where #Test1.id=#Test2.id FOR XML PATH('')),1,1,'') FROM #Test as #Test2

返回:

1   Ian,Mark
2   James
3   Karen,Suzie

这是我想要的回报。但是,XML元素何去何从?

4 个答案:

答案 0 :(得分:1)

这不是STUFF,这只是为了删除多余的第一个,

concat删除了XML内容:

','+ NAME
or
NAME + ''

不要问我为什么它会像这样工作,也许它会在某处记录: - )

答案 1 :(得分:1)

Xml语句的内部仅用于生成连接结果。为xml语句添加外部:

SELECT distinct ID,
    STUFF( (select ','+ NAME 
            from Test as #Test1 
            where #Test1.id=#Test2.id 
            FOR XML PATH('')),1,1,'') as Names
FROM Test as #Test2
FOR XML PATH('')

输出:

 <ID>1</ID><Names>Ian,Mark</Names><ID>2</ID><Names>James</Names><ID>3</ID><Names>Karen,Suzie</Names>

小提琴http://sqlfiddle.com/#!6/5f254/13

答案 2 :(得分:1)

你必须比较苹果和苹果。

确实如此
Cell

产生的东西看起来像XML(但技术上并不是因为它没有根元素),这(你实际上正在运行的)

select * from #Test for xml path('')

没有按&#39;吨。在我的机器上,它产生ff字符串:&#34;,Ian,Mark,James,Karen,Suzie&#34;。从那里,stuff函数敲击第一个逗号,你得到一个逗号分隔值列表。

答案 3 :(得分:1)

  

为什么STUFF会删除XML?

STUFF删除字符串中的第一个逗号,它不负责删除XML元素名称。

FOR XML PATH使用列名来创建XML元素名称。当您将两个值连接在一起','+ NAME时,结果列没有名称,因此FOR XML PATH无法为您生成元素名称。

行为记录在Columns without a Name

  

任何没有名称的列都将被内联。例如,计算   不指定列别名的列或嵌套标量查询   生成没有任何名称的列。