MSSQL 游標使用 心得

2022-09-25 07:12:08 字數 4673 閱讀 3304

游標為您提供了在逐行的基礎上而不是一次處理整個結果集為基礎的操作表中資料的方法。

1.如何使用游標

1)定義游標語句 declare 游標名》 cursor for

2)建立游標語句 open 游標名》

3)提取游標列值、移動記錄指標 fetch 列名列表》 from 游標名》 [into 變數列表》]

4)使用@@fetch_status利用while迴圈處理游標中的行

5)刪除游標並釋放語句 close 游標名》/deallocate 游標名》

6)游標應用例項

--定義游標

declare cur_depart cursor

for select cdeptid,cdeptname from department into @deptid,@deptname

--建立游標

open cur_depart

--移動或提取列值

fetch from cur_depart into @deptid,@deptname

--利用迴圈處理游標中的列值

while @@fetch_status=0

begin

print @deptid,@deptname

fetch from cur_depart into @deptid,@deptname

end

--關閉/釋放游標

close cur_depart

deallocate cur_depart

2.語句的詳細及注意

1)定義游標語句

declare 游標名》 [insensitive] [scroll] cursor

for ]}]

insensitive dbms建立查詢結果集資料的臨時副本(而不是使用直接引用資料庫表中的真實資料行中的列)。游標是read only,也就是說不能修改其內容或底層表的內容;

scroll 指定游標支援通過使用任意fetch 選項(first last prior next relative absolute)選取它的任意行作為當前行。如果此項省略,則游標將只支援向下移動單行(即只支援游標的fetch next);

select語句 定義游標結果集的標準 select 語句。在游標宣告的 read only 防止使用游標的使用者通過更新資料或刪除行改變游標的內容;

update 建立可更新游標且列出值能被更新的游標列。如果子句中列入了任意列,則只有被列入的列才能被更新。如果declare cursor語句中只指定的update(沒有列名列表),則游標將允許更新它的任何或所有列。

declare cur_depart cursor

for select * from department for update of cdeptid,cdeptname

2)提取游標列值、移動記錄指標語句

fetch [next | prior | first | last | | ]

from 游標名》 [into 變數列表……>]

每次執行fetch語句時,dbms移到游標中的下一行並把游標中的列值獲取到into中列出的變數中。因此fetch語句的into子句中列出的變數必須與游標定義中select 語句中的列表的型別與個數相對應;

僅當定義游標時使用scroll引數時,才能使用fetch語句的行www.cppcns.com定位引數(first last prior next relative absolute);如果fetch語句中不包括引數next | prior | fir | last,dbms將執行預設的fetch next;

next 向下、向後移動一行(記錄);

prior 向上、向前移動一行(記錄);

first 移動至結果集的第一行(記錄);

last 移動至結果集的最後一行(記錄);

absolute n 移動到結果集中的第n行。如果n是正值,dbms從結果集的首部向後或向下移動至第n行;如果n是負數,則dbms從結果集的底部向前或向上移動n行;

fetch absolute 2 from cur_depart into @deptid,@deptname

relative n 從指標的當前位置移動n行。如果n是正值,dbms將行指標向後或向下移動至第n行;如果n是負數,則dbms將行指標向前或向上移動n行;

fetch relative 2 from cur_depart into @deptid,@deptname

3)基於游標的定位delete/update語句

如果游標是可更新的(也就是說,在定義游標語句中不包括read only 引數),就可以用游標從游標資料的源表中delete/update行,即delete/update基於游標指標的當前位置的操作;

舉例:

--刪除當前行的記錄

declare cur_depart cursor

for select cdeptid,cdeptname from department into @deptid,@deptname

open cur_depart

fetch from cur_depart into @deptid,@deptname

delete from department where current of cur_depart

--更新當前行的內容

declare cur_depart cursor

for select cdeptid,cdeptname from department into @deptid,@deptname

open cur_depart

fetch from cur_depart into @deptid,@deptname

upda程式設計客棧te department set cdeptid='2007' + @deptid where current of cur_depart

3.游標使用技巧及注意

1)利用order by改變游標中行的順序此處應該注意的是,只有在查詢的中select 子句**現的列才能作為order by子句列,這一點與普通的select語句不同;

2)當語句中使用了order by子句後,將不能用游標來執程式設計客棧行定位delete/update語句;如何解決這個問題,首先在原表上建立索引,在建立游標時指定使用此索引來實現;例如:

declare cur_depart cursor

for select cdeptid,cdeptname from department with index(idx_id)

for update of cdeptid,cdeptname

通過在from子句中增加with index來實現利用索引對錶的排序;

3)在游標中可以包含計算好的值作為列;

4)利用@@cursor_rows確定游標中的行數;

alter function sel_keyar(@yearnum int,@f_k_lessonid varchar(15))

returns varchar(8000)

as begin

declare @nian varchar(8000),@nums int,@nians varchar(8000)

set @nums=1

declare getyear cursor for select f_year from t_kejianol where f_k_lessonid=@f_k_lessonid group by f_year order by f_year desc

open getyear

fetch next from getyear into @nian

while @@fetch_status=0

begin

if @yearnum=@nums

set @nians=isnull(@nians+',','')+rtrim(@nian)

select @nums=@nums+1

fetch next from getyear into @nian

--fetch absolute 3 from getyear into @nian

end

close getyear

deallocate getyear

--print @nians

return @nians

end

alter function sel_keyar(@yearnum int,@f_k_lessonid varchar(15))

returns varchar(8000)

as begin

declare @nian varchar(8000),@nians varchar(8000)

declare getyear cursor for select f_year from t_kejianol where f_k_lessonid=@f_k_lessonid group by f_year order by f_year asc

open getyear

fetch absolute @yearnum from getyear into @nian

close getyear

deallocate getyear

return @nians

end

本文標題: mssql 游標使用 心得

本文位址:

MSSQL 游標的使用

與windows或dos的 游標 不同,ms sql的游標是一種臨時的資料庫物件,既對可用來旋轉儲存在系統永久表中的資料行的副本,也可以指向儲存在系統永久表中的資料行的指標。游標為您提供了在逐行的基礎上而不是一次處理整個結果集為基礎的操作表中資料的方法。1 如何使用游標 1 定義游標語句 decla...

MSSQL 游標使用例項

declare mycursor cursor forselect iglidenum,saccflag,a.sdeptno,saccman,ent mobil,daccdate,dsfinishdate from eg shl accept asa,eg sys entry ase where s...

frameset 使用心得

欲明白本篇 html徹底剖析 之標記分類,請看 標記一覽 也請先明白圍堵標記與空標記的分別,請看 html概念 框架概念 謂框架便是網頁畫面分成幾個框窗,同時取得多個 url。只需要 即可,面所有框架標記需要放在乙個總起的 html 檔,這個檔案只記錄了該框架如何分割 不會顯示任何資料,所以不必放入...