我有一个临时表变量,我需要使用类似逗号分隔的字符串进行更新。
declare @clients table (clientid int, hobbylist char(1000))
declare @hobbies table (clientid int, hobbynumber smallint)
insert into @clients values (3, '')
insert into @clients values (5, '')
insert into @clients values (12, '')
insert into @hobbies values (3, 4)
insert into @hobbies values (3, 5)
insert into @hobbies values (3, 7)
insert into @hobbies values (12, 3)
insert into @hobbies values (12, 7)
所以@clients包含:
clientid hobbylist
---------------------------
3
5
12
@hobbies包含:
clientid hobbylist
---------------------------
3 4
3 5
3 7
12 3
12 7
我需要更新@clients表,使其包含:
clientid hobbylist
---------------------------
3 4;;5;;7
5
12 3;;7
我发现最接近的是: How to concatenate multiple rows? 但我无法理解他是如何得到“一,二,三”的,看看标记为正确答案的是什么。
我正在使用SQL Server 2008 R2 64.我尝试使用游标,但速度很慢(此sp中会有大量此类内容)。
最有效的方法是什么?
编辑:
根据njk的建议,我尝试了这个:
update c
set hobbylist=Stuff((
Select ';;' + cast(hobbynumber as char)
From @hobbies h
Where h.clientid = c.clientid
For XML Path('')
), 1, 1, '')
from @clients c
它没有给我一个错误,但结果如此糟糕,我找不到一个好方法在这里展示。
e.g。客户端3的业余爱好列表如下所示:
;4 ;;5 ;;7
ALMOST有效。不知道空间的来源。
编辑2。
咄。我正在使用演员。我需要修剪一下。此解决方案适用于我的服务器。我将看看我是否可以使ClearLogic正常工作,所以我可以将其标记为正确的答案。
答案 0 :(得分:2)
你去吧
;WITH CTE AS
(SELECT DISTINCT clientid,hobbylist= STUFF((SELECT ';'+ LTRIM(STR(hobbynumber))
FROM @hobbies yt
WHERE yt.clientid = sc.clientid
FOR XML PATH(''), TYPE).value('.','VARCHAR(max)'), 1, 1, '')
FROM @hobbies AS sc
)
UPDATE a
SET a.hobbylist=b.hobbylist
FROM @clients AS a
INNER JOIN CTE AS b
ON a.clientid = b.clientid
答案 1 :(得分:0)
试试这个>
update c SET c.hobbylist = e.list from @clients c inner join
(select clientid,STUFF((select ';;'+cast(hobbynumber as varchar(10))from @hobbies h where h.clientid = c.clientid for xml path('')),1,2,'') as list
from @hobbies c
group by clientid) e
on c.clientid = e.clientid
select * from @clients