網上搜了一圈還是有不錯的方法的,比如STUFF函數,我們可以這么寫得到上面的結果:
SELECT [TYPE], STUFF( ( SELECT ','+ [Name] FROM test b WHERE b.Type = a.Type FOR XML PATH('')),1 ,1, '') [Names] from Test a group by [TYPE]
最近在項目中遇到個問題,需要將表中某列字段合並成字符串輸出,如果直接通過代碼全部讀取出來,再遍歷進行拼接顯然不是最好的方法,所以想着能否在數據讀取的時候直接拼接好返回,網上搜了可通過for xml來實現。
首先,准備好需要的數據,腳本如下:
復制代碼
if exists (select * from sysObjects where id=object_id('Student'))
drop table Student
go
create table Student
(
Id int,
Name varchar(20)
)
go
insert into Student values(1,‘張三’);
insert into Student values(2,‘李四’);
insert into Student values(3,‘王五’);
復制代碼
當前表中數據如下:
需要將Name以“張三;李四;王五”格式顯示。
具體通過實現如下:
select stuff((
select ';'+name
from Student for xml path('')),1,1,'') as name
乍一看,是不是有點迷糊,不急,下面我們一一道來。
上面語句我們分為兩部分來看,首先要明白for xml path的用法,在SQL SERVER中我們有很多方法讀取XML字段中的片段,反過來SQL SERVER也允許我們將表數據以XML方式顯示,for xml path便是以xml顯示的一種方式。
select ';'+name
from Student for xml path('')
這段代碼就是告訴數據庫服務器要將生成的XML中name值以“;”方式進行拼接。
更多可參考:http://www.cnblogs.com/doubleliang/archive/2011/07/06/2098775.html
其次,我們理解stuff函數的用法,通過上述代碼拼接生成的內容為“;張三;李四;王五”,顯然最前的“;”是多余的,所以我們通過stuff來去除。
STUFF(string,insert position,delete count,string inserted)函數是將一個字符串插入到另一個字符串中。插入時,插入的字符串可能刪除指定數量的字符。
第一個參數string,指的就是你要操作的內容,可以是一個固定字符串,也可以指定為某列;
第二個參數insert position,指插入開始位置,SQLSERVER中默認是從1開始,而非從0開始;
第三個參數delete count,指的是要刪除的字符個數,從position刪除指定的個數,如果count為0表示不刪除;
第四個參數string inserted,表示要插入的字符串;
eg:select stuff('abcdefg',3,2,'123')
結果:ab123efg