2011-04-08 77 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;