SQL Server游標的使用

2021-06-20 20:57:14 字數 4076 閱讀 1682

declare cursor_name cursor [ local | global ] 

[ forward_only | scroll ]

[ static | keyset | dynamic | fast_forward ]

[ read_only | scroll_locks | optimistic ]

[ type_warning ]

for select_statement

[ for

update [ of column_name [ ,...n ] ] ]

[;]

下面我們來看游標定義的引數:

local

意味著游標的生存週期只在批處理或函式或儲存過程中可見,而global意味著游標對於特定連線作為上下文,全域性內有效,例如:

如果不指定游標作用域,預設作用域為global

表明所有的提取操作(如

first

、last

、prior

、next

、relative

、absolute

)都可用。如果不使用該保留字,那麼只能進行

next 

提取操作。由此可見,

scroll 

極大地增

加了提取資料的靈活性,可以隨意讀取結果集中的任一行資料記錄,而不必關閉再

重開游標。

表明所有的提取操作(如

first

、last

、prior

、next

、relative

、absolute

)都可用。如果不使用該保留字,那麼只能進行

next 

提取操作。由此可見,

scroll 

極大地增

加了提取資料的靈活性,可以隨意讀取結果集中的任一行資料記錄,而不必關閉再

重開游標。

表明所有的提取操作(如first、 last、 prior、 next、 relative、 absolute)都可用。如果不使用該保留字,那麼只能進行next 提取操作。由此可見,scroll 極大地增加了提取資料的靈活性,可以隨意讀取結果集中的任一行資料記錄,而不必關閉再 重開游標。

表明所有的提取操作(如

first

、last

、prior

、next

、relative

、absolute

)都可用。如果不使用該保留字,那麼只能進行

next 

提取操作。由此可見,

scroll 

極大地增

加了提取資料的靈活性,可以隨意讀取結果集中的任一行資料記錄,而不必關閉再

重開游標。

forward_only意味著游標只能從資料集開始向資料集結束的方向讀取,fetch next是唯一的選項,而scroll支援游標在定義的資料集中向任何方向,或任何位置移動,如下圖:

這四個關鍵字是游標所在資料集所反應的表內資料和游標讀取出的資料的關係

static意味著,當游標被建立時,將會建立for後面的select語句所包含資料集的副本存入tempdb資料庫中,任何對於底層表內資料的更改不會影響到游標的內容.

dynamic是和static完全相反的選項,當底層資料庫更改時,游標的內容也隨之得到反映,在下一次fetch中,資料內容會隨之改變

keyset可以理解為介於static和dynamic的折中方案。將游標所在結果集的唯一能確定每一行的主鍵存入tempdb,當結果集中任何行改變或者刪除時,@@fetch_status會為-2,keyset無法探測新加入的資料

fast_forward可以理解成forward_only的優化版本.forward_only執行的是靜態計畫,而fast_forward是根據情況進行選擇採用動態計畫還是靜態計畫,大多數情況下fast_forward要比forward_only效能略好.

read_only意味著宣告的游標只能讀取資料,游標不能做任何更新操作

scroll_locks是另一種極端,將讀入游標的所有資料進行鎖定,防止其他程式進行更改,以確保更新的絕對成功

optimistic是相對比較好的乙個選擇,optimistic不鎖定任何資料,當需要在游標中更新資料時,如果底層表資料更新,則游標內資料更新不成功,如果,底層表資料未更新,則游標內錶資料可以更新

當定義完游標後,游標需要開啟後使用,只有簡單一行**:

open test_cursor
注意,當全域性游標和區域性游標變數重名時,缺省會開啟區域性變數游標

游標的使用分為兩部分,一部分是操作游標在資料集內的指向,另一部分是將游標所指向的行的部分或全部內容進行操作

只有支援6種移動選項,分別為到第一行(first),最後一行(last),下一行(next),上一行(prior),直接跳到某行(absolute(n)),相對於目前跳幾行(relative(n)),例如:

對於未指定scroll選項的游標來說,只支援next取值.

第一步操作完成後,就通過into關鍵字將這行的值傳入區域性變數:

比如下面**:

declare update_cursor11 cursor for   select 聯絡位址 from tb_ygxx  where 年齡》25 for update                          --宣告為"可更新游標"

update tb_ygxx set 聯絡位址='貴州市' where current of update_cursor11 更新上一條資料

fetch from update_cursor11 into @lxdz                                      --提取游標中的資料儲存到變數中去

update tb_ygxx set 聯絡位址='貴州市' where current of update_cursor11 fetch from update_cursor11 into @lxdz                                      --提取游標中的資料儲存到變數中去

fetch from delete_cursor

delete from 員工備份 where current of delete_cursor      /*刪除第一行記錄*/

fetch from delete_cursor

fetch from delete_cursor

delete from 員工備份 where current of delete_cursor      /*刪除第三行記錄*/

在游標使用完之後,一定要記得關閉,只需要一行**:close+游標名稱

close test_cursor
當游標不再需要被使用後,釋放游標,只需要一行**:deallocate+游標名稱

deallocate test_cursor
本文從游標的基本概念,到生命週期來談游標。游標是非常**的一種存在,使用游標經常會比使用面向集合的方法慢2-3倍,當游標定義在大資料量時,這個比例還會增加。如果可能,盡量使用while,子查詢,臨時表,函式,表變數等來替代游標,記住,游標永遠只是你最後無奈之下的選擇,而不是首選。

游標是**的!

SQL Server游標的使用

由於sql server中沒有提供直接遍歷表的每一行的方法,所以只有通過游標和while迴圈來代替。當讓也可以不適用游標,僅僅使用while迴圈也能遍歷表 當id為int,主鍵時可用這種方式 但兩種方式我沒有做過實際的對比測試,效率誰高誰低我也不好說。我只給乙個游標使用的簡單示例,想深入了解和使用游...

SQL SERVER 游標的使用

定義游標,讓游標指向sql查詢的結果 declare democursor cursor for select name,id from userinfo 開啟游標。open democursor declare name nvarchar 32 declare id int 把游標指向的資料取出來...

sqlserver 游標的使用

游標 游標可以對乙個select的結果集進行處理,或是不需要全部處理,就會返回乙個對記錄集進行處理之後的結果。1 游標實際上是一種能從多條資料記錄的結果集中每次提取一條記錄的機制。游標可以完成 允許定位到結果集中的特定行 從結果集的當前位置檢索一行或多行資料 支援對結果集中當前位置的進行修改 由於游...