2011-04-08 76 views
0

Speeading了查詢我的查詢,看起來像這樣通過刪除光標

declare @tmpTable Table(id int) 
insert into @tmpTable(id) values (3) 
insert into @tmpTable(id) values (5) 
insert into @tmpTable(id) values (11) 

declare @tmp int 
declare @finalString varchar(MAX) 

DECLARE c1 CURSOR READ_ONLY FOR SELECT ID FROM @tmpTable 
OPEN c1 
FETCH NEXT FROM c1 INTO @tmp 
set @finalString=cast(@tmp as varchar) 
FETCH NEXT FROM c1 INTO @tmp 
WHILE @@FETCH_STATUS = 0 
begin 
    set @[email protected]+','+cast(@tmp as varchar) 
    FETCH NEXT FROM c1 INTO @tmp 
end  
close c1 
deallocate c1 

select @finalString 

我想創建一個字符串從表列值格式化這樣「-3,5,11-」,此代碼的工作,但有一個更好的方法來做到這一點?

+1

是的。幾種方法。建議您搜索SO ... – 2011-04-08 08:16:57

+0

:http://stackoverflow.com/questions/1071022/fastest-way-to-loop-thru-a-sql-query – 2011-04-08 08:19:36

+1

http://stackoverflow.com/questions/4019942/concatenating-string – 2011-04-08 08:20:23

回答

0

當然 - 使用此方法(STUFFFOR XML PATH合併):

SELECT 
    STUFF((SELECT ','+CAST(id AS VARCHAR(10)) 
      FROM @tmpTable  
      FOR XML PATH('')), 1, 1, '') 

返回的輸出:

3,5,11 
0

您可以使用CTE或XQuery。

CTE: 
with t1(rowNum, id) as 
(
    select rowNum, id from Temp1 
), 
t2(rowNum, str) as 
(
    select 1, cast(id as varchar(250)) from t1 where rowNum=1 
    union all 
    select t1.rowNum, str || ',' || cast(t1.id as varchar(3)) from t1,t2 
    where t2.rowNum+1 = t1.rowNum 
) 
select str from t2 order by rownum desc FETCH FIRST 1 ROWS ONLY;