Sql 为什么东西会删除XML?

Sql 为什么东西会删除XML?,sql,sql-server,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语句: sele

请参见下面的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('')
SELECT distinct ID,
STUFF( (select ','+ NAME from #Test as #Test1 where #Test1.id=#Test2.id FOR XML PATH('')),1,1,'') FROM #Test as #Test2
返回:

<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>
1   Ian,Mark
2   James
3   Karen,Suzie
返回:

<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>
1   Ian,Mark
2   James
3   Karen,Suzie

这就是我想要的回报。但是,XML元素到哪里去了?

它不是
东西
,这只是为了先删除多余的

concat删除了XML内容:

','+ NAME
or
NAME + ''

不要问我为什么它是这样工作的,也许它在某处有文档记录:-)

内部for xml语句只是用于生成连接结果。添加外部for 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>
1Ian,Mark2James3Karen,Suzie

小提琴

你必须把苹果和苹果进行比较。虽然这是真的

select * from #Test for xml path('')
生成看起来像XML的东西(但从技术上讲不是因为它没有根元素),这是(您实际运行的)

没有。在我的机器上,它产生ff字符串:“,伊恩,马克,詹姆斯,凯伦,苏西”。从这里开始,stuff函数重击第一个逗号,得到逗号分隔值的列表

为什么东西会删除XML

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

FOR XML PATH
使用列名创建XML元素名。将两个值合并时,“+NAME结果列没有名称,因此XML路径的
无法为您生成元素名称

该行为记录在中

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


这是我读到的关于这个的最重要的事情之一。这证明该代码实际上是一种黑客行为,在未来的版本中可能无法依赖。这是正确的答案。