0

我有一个临时表变量,我需要用类似逗号分隔的字符串来更新它。

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

我发现最接近的是: 如何连接多行? 但我不明白他是如何看到标记为正确答案的内容时得到“一、二、三”的。

我正在使用 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

它没有给我一个错误,但是结果太古怪了,我找不到在这里展示它的好方法。

例如,客户 3 的爱好列表如下所示:

;4                             ;;5                             ;;7                                                                                                                               

几乎可以工作。不知道这些空间是从哪里来的。

编辑 2。

呃。我正在使用演员表。我需要修剪东西。该解决方案适用于我的服务器。我要看看我是否也能让 ClearLogic 正常工作,所以我可以将其标记为正确答案。

4

2 回答 2

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
于 2012-09-06T00:08:22.653 回答
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 
于 2012-09-06T04:49:58.747 回答