SQLServer 游标简介与使用说明[转]
游標(Cursor)是處理數據的一種方法,為了查看或者處理結果集中的數據,游標提供了在結果集中一次以行或者多行前進或向后瀏覽數據的能力。我們可以把游標當作一個指針,它可以指定結果中的任何位置,然后允許用戶對指定位置的數據進行處理。
1.游標的組成
游標包含兩個部分:一個是游標結果集、一個是游標位置。
游標結果集:定義該游標得SELECT語句返回的行的集合。游標位置:指向這個結果集某一行的當前指針。
2.游標的分類
游標共有3類:
其中前兩種游標都是運行在服務器上的,所以又叫做服務器游標。
API服務器游標
API服務器游標主要應用在服務上,當客戶端的應用程序調用API游標函數時,服務器會對API函數進行處理。使用API函數和方法可以實現如下功能:
API服務器游標包含以下四種:靜態游標、動態游標、只進游標、鍵集驅動游標(Primary key)
- 靜態游標的完整結果集將打開游標時建立的結果集存儲在臨時表中,(靜態游標始終是只讀的)。靜態游標具有以下特點:總是按照打開游標時的原樣顯示結果集;不反映數據庫中作的任何修改,也不反映對結果集行的列值所作的更改;不顯示打開游標后在數據庫中新插入的行;組成結果集的行被其他用戶更新,新的數據值不會顯示在靜態游標中;但是靜態游標會顯示打開游標以后從數據庫中刪除的行。
- 動態游標與靜態游標相反,當滾動游標時動態游標反映結果集中的所有更改。結果集中的行數據值、順序和成員每次提取時都會改變。
- 只進游標不支持滾動,它只支持游標從頭到尾順序提取數據行。注意:只進游標也反映對結果集所做的所有更改。
- 鍵集驅動游標同時具有靜態游標和動態游標的特點。當打開游標時,該游標中的成員以及行的順序是固定的,鍵集在游標打開時也會存儲到臨時工作表中,對非鍵集列的數據值的更改在用戶游標滾動的時候可以看見,在游標打開以后對數據庫中插入的行是不可見的,除非關閉重新打開游標。
Transaction-SQL游標
該游標是基于Declare Cursor 語法,主要用于Transaction-SQL腳本、存儲過程以及觸發器中。Transaction-SQL游標在服務器處理由客戶端發送到服務器的Transaction-SQL語句。
在存儲過程或觸發器中使用Transaction-SQL游標的過程為:
客戶端游標
該游標將使用默認結果集把整個結果集高速緩存在客戶端上,所有的游標操作都在客戶端的高速緩存中進行。注意:客戶端游標只支持只進和靜態游標。不支持其他游標。
?
3.游標的生命周期
游標的生命周期包含有五個階段:聲明游標、打開游標、讀取游標數據、關閉游標、釋放游標。
聲明游標是為游標指定獲取數據時所使用的Select語句,聲明游標并不會檢索任何數據,它只是為游標指明了相應的Select 語句。
Declare 游標名稱 Cursor 參數
聲明游標的參數
標準游標:
1Declare?MyCursor?Cursor?2???????For?Select?*?From?Master_Goods
只讀游標
2??????For?Select?*?From?Master_Goods
3??????For?Read?Only
可更新游標
2??????For?Select?*?From?Master_Goods
3??????For?UpDate
打開游標使用Open語句用于打開Transaction-SQL服務器游標,執行Open語句的過程中就是按照Select語句進行填充數據,打開游標以后游標位置在第一行。
打開游標
- 全局游標:Open Global MyCursor
- 局部游標: Open MyCursor
讀取游標數據:在打開游標以后,使用Fetch語句從Transaction-SQL服務器游標中檢索特定的一行。使用Fetch操作,可以使游標移動到下一個記錄,并將游標返回的每個列得數據分別賦值給聲明的本地變量。
1Fetch?[Next?|?Prior?|?First?|?Last?|?Absolute n |?Relative n ]??From?MyCursor?2
3Into?@GoodsID,@GoodsName
4
?
其中:Next表示返回結果集中當前行的下一行記錄,如果第一次讀取則返回第一行。默認的讀取選項為Next
Prior表示返回結果集中當前行的前一行記錄,如果第一次讀取則沒有行返回,并且把游標置于第一行之前。
First表示返回結果集中的第一行,并且將其作為當前行。
Last表示返回結果集中的最后一行,并且將其作為當前行。
Absolute n 如果n為正數,則返回從游標頭開始的第n行,并且返回行變成新的當前行。如果n為負,則返回從游標末尾開始的第n行,并且返回行為新的當前行,如果n為0,則返回當前行。
Relative n 如果n為正數,則返回從當前行開始的第n行,如果n為負,則返回從當前行之前的第n行,如果為0,則返回當前行。
關閉游標調用的是Close語句,方式如下:
1Close?Global?MyCursor???????????????Close?MyCursor
釋放游標調用的是Deallocate語句,方法如下:
游標實例:
?
Code?1Declare?MyCusror?Cursor?Scroll
?2
?3??????For?Select?*?From?Master_Goods?Order?By?GoodsID
?4
?5???Open?MyCursor
?6
?7???Fetch?next?From?MyCursor
?8???Into?@GoodsCode,@GoodsName
?9
10???While(@@Fetch_Status?=?0)
11??????Begin
12
13?????????????Begin
14???????????????????Select?@GoodsCode?=?Convert(Char(20),@GoodsCode)
15???????????????????Select?@GoodsName?=?Convert(Char(20),@GoodsName)
16???????????????????PRINT?@GoodsCode?+?':'?+?@GoodsName
17?????????????End
18
19?????????????Fetch?next?From?MyCursor
20?????????????Into?@GoodsCode,@GoodsName
21
22??????End
23???Close?MyCursor
24???Deallocate?MyCursor
25
修改當前游標的數據方法如下:
刪除當前游標行數據的方法如下:
?
Select @@CURSOR_ROWS 可以得到當前游標中存在的數據行數。注意:此變量為一個連接上的全局變量,因此只對應最后一次打開的游標。
?
轉載于:https://www.cnblogs.com/qiangshu/archive/2009/10/28/1591510.html
總結
以上是生活随笔為你收集整理的SQLServer 游标简介与使用说明[转]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 判断泛型的值是否为default(T)
- 下一篇: Exception: com.mchan