中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SqlServer系列筆記——游標

發布時間:2020-07-20 12:15:02 來源:網絡 閱讀:308 作者:codejson 欄目:數據庫

游標的概念

游標是一種數據訪問機制,是一個在給定結果集中以行為單位訪問和操縱數據的數據庫對象

游標的好處:可以逐行的處理數據允許定位于結果集中的特定的行從當前結果集中獲取一行

能對結果集的當前行進行修改

 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參數


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

松阳县| 马关县| 平乡县| 河西区| 抚松县| 磐安县| 漠河县| 都江堰市| 墨脱县| 田阳县| 土默特左旗| 靖州| 扬州市| 汉阴县| 朔州市| 上思县| 内乡县| 五指山市| 松阳县| 崇阳县| 日喀则市| 金秀| 昌宁县| 扎囊县| 英吉沙县| 乌鲁木齐县| 突泉县| 建湖县| 巍山| 错那县| 永登县| 申扎县| 弥勒县| 成武县| 万盛区| 福州市| 交口县| 道孚县| 宜昌市| 子长县| 翼城县|