【问题标题】:Speeading up query by removing cursor通过删除游标加速查询
【发布时间】:2011-04-08 08:15:36
【问题描述】:

我的查询看起来像这样

 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 @finalString=@finalString+','+cast(@tmp as varchar)
  FETCH NEXT FROM c1 INTO @tmp
 end    
 close c1
 deallocate c1  

 select @finalString

我想从表格列值创建以这种方式“3,5,11”格式的字符串,此代码有效,但有更好的方法吗?

【问题讨论】:

标签: sql sql-server-2005


【解决方案1】:

当然 - 使用此方法(STUFFFOR XML PATH 结合使用):

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

返回以下输出:

3,5,11

【讨论】:

    【解决方案2】:

    您可以使用 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;
    

    【讨论】:

      猜你喜欢
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 2019-09-30
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多