用迴圈代替游標

2021-03-31 08:57:00 字數 1691 閱讀 3223

在sql的sp開發中,游標有不可或缺的作用。但是,一些不當的使用游標,會造成嚴重系統效能的下降,所有呢,很多的人就想找乙個方法,即能達到游標的功能,又對效能影響小一些。這就是本文要講的用迴圈代替游標。

一般情況下,用光標的目的就是要達到乙個迴圈,可是我們要是以迴圈來作呢,如何來控制當前的變數值就是關鍵。

下列**中用到的表

create table tbluserdetail

(username nvarchar(30) not null,/*使用者名稱*/

userage int,/*使用者年紀*/

userdepartment nvarchar(30)/*使用者部門*/

)上表中,有若干的資料。

現在呢,要取出各部門的前5句的人名,以年紀從大到小排.

用游標是可以作,

**如下

declare @department nvarchar(30)

declare curdepartment cursor for select distinct userdepartment from tbluserdetail

open curdepartment

fetch next from curdepartment into @department

while @@fetch_status=0

begin

select top 5 username

from tbluserdetail

where userdepartment=@department

order by userage desc

fetch next from curdepartment into @department

endclose curdepartment

deallocate curdepartment

用迴圈來作呢,就要用到乙個臨時表

declare @tbldepartment table(

uid int identity(1,1),

department nvarchar(30))

declare @department nvarchar(30)

declare @ncount as int

declare @allcount as int

select @ncount=1

insert @tbldepartment (department)

select distinct userdepartment from tbluserdetail

select @allcount=@@rowcount

while @ncount<=@allcount

begin

select top 5 username

from tbluserdetail

where userdepartment=(select department from @tbldepartment where uid=@ncount)

order by userage desc

select @ncount=@ncount+1

end這樣,功能是相同,用迴圈時,不易引起由游標使用不當而造成的死鎖,這在對資料量很大的表操作時,效果會很明顯.

當然,有一些情況是無法用迴圈來代替游標的。比如說:乙個表中有許多完全相同的記錄,要對第一條作更新,第二條不改動,

這時就迴圈沒有辦法了。

用普通T SQL語句代替游標操作

經常寫sql的同學們都知道,在sql server的ide中如果sql巢狀的層次太多,檢視和修改 將變得非常痛苦,再加上游標用得不恰當很容易出現 鎖 和 效能 問題.所以通常大大們都勸大家盡量少用游標,阿飛個人很喜歡將業務邏輯寫在儲存過程裡,於是也經常遇到需要游標邏輯的地方,這裡就跟大家分享一點使用...

N皇后問題 用遞迴代替多重迴圈

include include using namespace std int n int queenposition 100 假定不會超過100個皇后 void queen int k 假定1 k 1行已經擺好皇后 int main void queen int k if k n for int ...

代替for迴圈的方法

為什麼要挑戰自己在 裡不寫for loop?因為這樣可以迫使你去使用比較高階 地道的語法或庫。文中以python為例子,講了不少大家其實在別人的 裡都見過 但自己很少用的語法。這是乙個挑戰。我要你避免在任何情況下寫for迴圈。同樣的,我也要你找到一種場景 除了用for迴圈以外,用其他方法寫都太難。請...