在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迴圈以外,用其他方法寫都太難。請...