代码之家  ›  专栏  ›  技术社区  ›  Ali Tarhini

替代sql游标

  •  3
  • Ali Tarhini  · 技术社区  · 14 年前

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

    2 回复  |  直到 14 年前
        1
  •  8
  •   Timbo    14 年前

    当我不想用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
  •  2
  •   Charles Bretana    14 年前

    有几种选择:

    1. 最好是从数学集合的角度重新分析这个问题。如果能够做到这一点,它很可能在计算和性能方面都提供最佳的解决方案。
    2. 其次,使用临时表变量来存储 只有 钥匙 . 如果可能的话,使用递归公共表表达式将键插入这个临时表变量,否则,使用T-SQL编程循环(Where子句或某种形式的构造迭代循环),然后当临时表变量包含所有键值时,使用它以适当的方式连接到实际表,以执行您的实际SQL设计目标。。。在递归或迭代地构建临时表时,请仅使用键,以便在代价高昂的构建阶段尽可能缩小临时表的范围。。。
    3. 以类似的方式使用临时表(在磁盘上)。当需要此临时表变量包含多个列和/或非常大的(>1M)行数时,或者需要临时表具有多个主键索引时,这是一个更好的选择。。。。