SQLServer中将多行数据拼接为一行数据(一个字符串)
方法一: 使用T-SQL
DECLARE @Users NVARCHAR(MAX)
SET @Users = ''
SELECT @Users = @Users + ',' + UserName FROM dbo.[User]
WHERE RoleID = 1
SELECT @Users
方法二:使用for xml path('') 和stuff
--使用自连接、forxmlpath('')和stuff合并显示多行数据到一行中
--注
--1、计算列可以不用包含在聚合函数中而直接显示,如下面语句的val。
--2、forxmlpath('')应该应用于语句的最后面,继而生成xml。
--3、forxmlpath('root')中的path参数是生成的xml最顶级节点。
--4、字段名或是别名将成为xml的子节点,对于没有列名(字段+'')或是没有别名的字段将直接显示。[value]+','则是用,分隔的数据(aa,bb,)。
--5、对于合并多行数据显示为一行数据时使用自连。
--生成测试表并插入测试数据
createtabletb(idint,valuevarchar(10))
insertintotbvalues(1,'aa')
insertintotbvalues(1,'bb')
insertintotbvalues(2,'aaa')
insertintotbvalues(2,'bbb')
insertintotbvalues(2,'ccc')
go
--第一种显示
selectid,[val]=(
select[value]+','fromtbasbwhereb.id=a.idforxmlpath(''))fromtbasa
--第一种显示结果
--1aa,bb,
--1aa,bb,
--2aaa,bbb,ccc,
--2aaa,bbb,ccc,
--2aaa,bbb,ccc,
--第二种显示
selectid,[val]=(
select[value]+','fromtbasbwhereb.id=a.idforxmlpath(''))fromtbasa
groupbyid
--第二种显示结果
--1aa,bb,
--2aaa,bbb,ccc,
--第三种显示
selectid,[val]=stuff((
select','+[value]fromtbasbwhereb.id=a.idforxmlpath('')),1,1,'')fromtbasa
groupbyid
--第三种显示结果
--1aa,bb
--2aaa,bbb,ccc
--典型应用
--AMD_GiftNew中获取所有的管理员ID
--selectadminIds=stuff((select','+cast(UserIdasvarchar)fromMM_UserswhereRoleId=1andflag=0forxmlpath('')),1,1,'')
--典型应用显示结果
--3,27
转载自:http://blog.csdn.net/kula_dkj/article/details/8568599
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 = @PPIDgroup by PPID