For XML Path('') 实现多行合并到一行, 并带有分隔符

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

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

取别名

 

posted @ 2017-12-19 19:52  ProZkb  阅读(430)  评论(0编辑  收藏  举报