您好,登錄后才能下訂單哦!
游標的概念
游標是一種數據訪問機制,是一個在給定結果集中以行為單位訪問和操縱數據的數據庫對象
游標的好處:可以逐行的處理數據允許定位于結果集中的特定的行從當前結果集中獲取一行
能對結果集的當前行進行修改
T-SQL中的游標定義在MSDN中如下:
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 ] ] ] [;] --默認作用域為GLOBAL --默認 Forward_Only,意味著游標只能從數據集開始向數據集結束的方向讀取,FETCH NEXT是唯一的選項,而SCROLL支持游標在定義的數據集中向任何方向,或任何位置移動 --STATIC KEYSET DYNAMIC 和 FAST_FORWARD 四選一 這四個關鍵字是游標所在數據集所反應的表內數據和游標讀取出的數據的關系 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 三選一 READ_ONLY意味著聲明的游標只能讀取數據,游標不能做任何更新操作 SCROLL_LOCKS是另一種極端,將讀入游標的所有數據進行鎖定,防止其他程序進行更改,以確保更新的絕對成功 OPTIMISTIC是相對比較好的一個選擇,OPTIMISTIC不鎖定任何數據,當需要在游標中更新數據時,如果底層表數據更新,則游標內數據更新不成功,如果,底層表數據未更新,則游標內表數據可以更新
游標的類型
靜態游標:adopenstatic不檢測數據行的變化
動態游標:adopendynamic反映所有數據行的改變
僅向前游標:adopenforwardonly 不支持滾動
鍵集游標:adopenstatic能反映修改,但不能準群反映插入、刪除
游標的使用順序
定義游標declare
打開游標open
使用游標fetch
關閉游標close
釋放游標deallocate
declare curTest cursor
scroll for select Title from dbo.Course
open curTest --打開游標
fetch curTest
declare @Name varchar(50)
fetch first from curTest into @Name
print '課程:'+@Name
while @@FETCH_STATUS=0
begin
fetch next from curTest into @Name
print '課程:'+@Name
end
close curTest --關閉游標
deallocate curTest --釋放游標
如果能不用游標,盡量不要使用游標
用完用完之后一定要關閉和釋放
盡量不要在大量數據上定義游標
盡量不要使用游標上更新數據
盡量不要使用insensitive, static和keyset這些參數定義游標
如果可以,盡量使用FAST_FORWARD關鍵字定義游標
如果只對數據進行讀取,當讀取時只用到FETCH NEXT選項,則最好使用FORWARD_ONLY參數
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。