1. 程式人生 > >SQL Server中將多行資料拼接為一行資料(一個字串)

SQL Server中將多行資料拼接為一行資料(一個字串)

SELECT @Users = @Users + ‘,’ + UserName FROM dbo.[User]
WHERE RoleID = 1

SELECT @Users

方法二:使用for xml path(”) 和stuff
–使用 自連線、for xml path(”)和stuff合併顯示多行資料到一行中

–注
–1、計算列可以不用包含在聚合函式中而直接顯示,如下面語句的val。
–2、for xml path(”) 應該應用於語句的最後面,繼而生成xml。
–3、for xml path(‘root’)中的path引數是生成的xml最頂級節點。
–4、欄位名或是別名將成為xml的子節點,對於沒有列名(欄位+”)或是沒有別名的欄位將直接顯示。[value] +’,’則是用,分隔的資料(aa,bb,)。
–5、對於合併多行資料顯示為一行資料時使用自連。

–生成測試表並插入測試資料
create table tb(id int, value varchar(10))
insert into tb values(1, ‘aa’)
insert into tb values(1, ‘bb’)
insert into tb values(2, ‘aaa’)
insert into tb values(2, ‘bbb’)
insert into tb values(2, ‘ccc’)
go

–第一種顯示
select id, [val]=(
select [value] +’,’ from tb as b where b.id = a.id for xml path(”)) from tb as a
–第一種顯示結果
–1 aa,bb,
–1 aa,bb,
–2 aaa,bbb,ccc,
–2 aaa,bbb,ccc,
–2 aaa,bbb,ccc,

–第二種顯示
select id, [val]=(
select [value] +’,’ from tb as b where b.id = a.id for xml path(”)) from tb as a
group by id
–第二種顯示結果
–1 aa,bb,
–2 aaa,bbb,ccc,

–第三種顯示
select id, [val]=stuff((
select ‘,’+[value] from tb as b where b.id = a.id for xml path(”)),1,1,”) from tb as a
group by id
–第三種顯示結果
–1 aa,bb
–2 aaa,bbb,ccc

–典型應用
–AMD_GiftNew中獲取所有的管理員ID
–select adminIds = stuff((select ‘,’+cast(UserId as varchar) from MM_Users where RoleId = 1 and flag =0 for xml path(”)),1,1,”)
–典型應用顯示結果
–3,27

select PPID, [val]=stuff((
select CAST(SKUCD AS VARCHAR) + ‘,’ from PPSKUTbl as b where b.PPID = a.PPID for xml path(”)),1,1,”) from PPSKUTbl as a where PPID = @PPID group by PPID