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