请参阅下面的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元素何去何从?
答案 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>
答案 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。
中任何没有名称的列都将被内联。例如,计算 不指定列别名的列或嵌套标量查询 生成没有任何名称的列。