首先我们有一个表 查询结果如下:
现在我们想要把USER_NAME这一列的内容 放到一个字段里面去:
一行sql语句解决问题:
1
|
SELECT STUFF(( SELECT ',' + convert ( VARCHAR , USER_NAME) FROM TE_USER FOR XML PATH( '' )), 1, 1, '' ) AS UserName
|
解释一下上面这条语句:
1,首先STUFF函数在上面的语句里的作用是去除拼接的字符串最前面的逗号
STUFF函数的用法大概是STUFF(param1, startIndex, length, param2) 意思是将param1中自startIndex(SQL中都是从1开始 而非0)起 删除length个字符 然后用param2替换删掉的字符 具体用法请自行百度
2,重点说一下 FOR XML PATH:
执行SELECT * FROM TE_USER FOR XML PATH语句得到的结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
< row >
< USER_ID >1</ USER_ID >
< USER_NAME >张三</ USER_NAME >
< USER_PASSWORD >c4ca4238a0b923820dcc509a6f75849b</ USER_PASSWORD >
</ row >
< row >
< USER_ID >2</ USER_ID >
< USER_NAME >李四</ USER_NAME >
< USER_PASSWORD >c4ca4238a0b923820dcc509a6f75849b</ USER_PASSWORD >
</ row >
< row >
< USER_ID >3</ USER_ID >
< USER_NAME >王五</ USER_NAME >
< USER_PASSWORD >c4ca4238a0b923820dcc509a6f75849b</ USER_PASSWORD >
</ row >
|
看得出来 是把sql执行的结果转换成xml格式了
我们再来执行一下下面这条sql SELECT * FROM TE_USER FOR XML PATH('ABC')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
< ABC >
< USER_ID >1</ USER_ID >
< USER_NAME >张三</ USER_NAME >
< USER_PASSWORD >c4ca4238a0b923820dcc509a6f75849b</ USER_PASSWORD >
</ ABC >
< ABC >
< USER_ID >2</ USER_ID >
< USER_NAME >李四</ USER_NAME >
< USER_PASSWORD >c4ca4238a0b923820dcc509a6f75849b</ USER_PASSWORD >
</ ABC >
< ABC >
< USER_ID >3</ USER_ID >
< USER_NAME >王五</ USER_NAME >
< USER_PASSWORD >c4ca4238a0b923820dcc509a6f75849b</ USER_PASSWORD >
</ ABC >
|
发现xml的row节点变成我们自定义的ABC了 那么我们如果用 FOR XML PATH('') 就代表把节点变为空了:
1
2
3
4
5
6
7
8
9
|
< USER_ID >1</ USER_ID >
< USER_NAME >张三</ USER_NAME >
< USER_PASSWORD >c4ca4238a0b923820dcc509a6f75849b</ USER_PASSWORD >
< USER_ID >2</ USER_ID >
< USER_NAME >李四</ USER_NAME >
< USER_PASSWORD >c4ca4238a0b923820dcc509a6f75849b</ USER_PASSWORD >
< USER_ID >3</ USER_ID >
< USER_NAME >王五</ USER_NAME >
< USER_PASSWORD >c4ca4238a0b923820dcc509a6f75849b</ USER_PASSWORD >
|
把节点变空了以后 我们执行SELECT ',' +convert(VARCHAR, USER_NAME) FROM TE_USER FOR XML PATH('') 语句 结果:
,张三,李四,王五
这就实现了USER_NAME这一列的值取出来拼接到一起了 再用我们上面说的STUFF函数把最前面的逗号去掉 就可以了。
以上。