http://blog.csdn.net/rav009/article/details/50723307
T-sql 有一个for xml path('')的从句能把多行结果合并到一行,并成为xml 格式
比如有一张表tb有两列,其格式和数据为:
id value
—————
1 aa
1 bb
2 aaa
2 bbb
2 ccc
如果对其执行sql: select id, value from tb for xml path('tbnode')
则返回的结果集仅为一行一列:
<tbnode><id>1</id><value>aa</value><id>1</id><value>bb</value>........<id>2</id><value>ccc</value></tbnode>
现在我们取巧一点, 省略path括号里的内容, 同时把这两列想办法变成匿名列,sql如下:
- select id+'',value+'' from tb for xml path('') //在path("") 不写任何东西会自动生成一个序列标识符
- 那么返回结果如下(也是一个一行一列):
1aa1bb2aaa2bbb2ccc
基于这样的思路, 现在要对所有不同的ID的value进行合并,希望得到如下的结果集:
id value
—————
1 aa,bb
2 aaa,bbb,ccc- select value+',' from tb where ID=1 for xml path('')
这样就可以得到 "aa,bb," - select id,valuelist=stuff((select ','+value from tb as b where b.ID=a.ID for xml path('')),1,1,'') //注意这个Stuff函数的替换,因为select后跟的是',' 所以要把这个‘,’ 替换掉
from tb as a
group by id