2012-09-05 67 views
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 

我發現的最接近的是: How to concatenate multiple rows? 但我不明白他是如何得到「一,二,三」看什麼被標記爲正確的答案。我試過使用遊標,但它很慢(並且在這個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 

它沒有給我一個錯誤,但結果卻是如此wacked,我無法找到一個好辦法在這裏展示。

例如客戶端3的愛好列表如下所示:

;4        ;;5        ;;7                                

幾乎可以工作。不知道空間來自哪裏。

編輯2.

Duh。我正在使用演員。我需要修剪這個東西。這個解決方案適用於我的服務器。我將看看我是否也可以使ClearLogic的工作,所以我可以將其標記爲正確的答案。

+0

重複[SQL服務器?我可以用逗號分隔多行合併到一列(http://stackoverflow.com/questions/ 2046037/sql-server-can-i-comma-delimit-multiple-rows-into-one-column) – Kermit

+0

現在檢查出來,njk! (如果這是解決方案,你是我的英雄。) – Julie

+0

你只需要用雙分號替換逗號即可。 – Kermit

回答

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 
+0

不幸的是,我得到了一個錯誤。 (我正在學習各種新的2008年錯誤。)更新失敗,因爲以下SET選項有不正確的設置:'ARITHABORT'。驗證SET選項是否適用於計算列和/或過濾索引和/或查詢通知和/或XML數據類型方法和/或空間索引操作的索引視圖和/或索引 不知道這意味着什麼。 – Julie

+0

http://sqlfiddle.com/#!3/7bc93/2這裏是在SQL小提琴中工作的相同查詢。 – ClearLogic

+0

你在ado.net工作嗎?你嘗試過 - > SET ARITHABORT ON – ClearLogic

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