2010-11-23 64 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)的行數,或者如果您需要臨時表具有多個主鍵索引,則這是更好的選擇。 ..