首先我們有一個表 查詢結果如下:
現在我們想要把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函數把最前面的逗號去掉 就可以了。
以上。