sql游标的替代品

时间:2010-11-23 22:57:22

标签: sql sql-server

在sql server中使用游标的替代方法是什么。 我已经知道一个涉及使用Row_Number()函数的技巧,该函数对行进行编号然后我可以逐个循环它们。还有其他想法吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

有几个选择:

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