2010-11-23 66 views
3

在sql server中使用游标的替代方法有哪些? 我已经知道了一个技巧,它涉及到使用Row_Number()函数对行进行编号,然后我可以逐个循环。任何其他想法?sql游标的替代品

+3

有很多选择。发布一些目前涉及游标的sql代码,我们将能够将它转换为基于集合的方法。 – NotMe 2010-11-23 22:59:14

回答

8

当我不想让事情与SQL游标复杂化时,我经常填充临时表或表变量,然后做一个while循环来完成它们。

例如:

declare @someresults table (
    id int, 
    somevalue varchar(10) 
) 

insert into @someresults 
    select 
     id, 
     somevalue 
    from 
     whatevertable 

declare @currentid int 
declare @currentvalue varchar(10) 

while exists(select 1 from @someresults) 
begin 
    select top 1 @currentid = id, @currentvalue = somevalue from @someresults 

    --work with those values here 

    delete from @someresults where id = @currentid 
end 
2

有几个选项:

  1. 最好是重新分析来自基于集合的数学角度思考问题。如果能做到这一点,它很可能会提供最佳的解决方案,提供最佳的解决方案和性能。
  2. 其次,使用临时表变量来存储只有。如果可能的话,使用递归公用表表达式将键插入到该临时表变量中,或者如果失败,则使用T-SQL编程循环(Where子句或构造的某种迭代循环),然后当临时表变量具有全部键值,用它以适当的方式连接到真正的表,以执行任何你真正的SQL设计目标碰巧是......当你递归地使用键或迭代地构建临时表以保持它像可能在昂贵的施工阶段...
  3. 以与上述类似的方式使用临时表(在磁盘上)。如果需要此临时表变量包含多个列和/或非常大(> 1M)的行数,或者如果您需要临时表具有多个主键索引,则这是更好的选择。 ..