Sql 为什么东西会删除XML?
请参见下面的DDL: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
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路径的无法为您生成元素名称
该行为记录在中
任何没有名称的列都将内联。例如,计算
不指定列别名的列或嵌套标量查询将
生成没有任何名称的列
这是我读到的关于这个的最重要的事情之一。这证明该代码实际上是一种黑客行为,在未来的版本中可能无法依赖。这是正确的答案。