在SqlServer存储过程中使用Cursor(游标)操作记录
1. 為何使用游標: ???? 使用游標(cursor)的一個主要的原因就是把集合操作轉(zhuǎn)換成單個記錄處理方式。用SQL語言從數(shù)據(jù)庫中檢索數(shù)據(jù)后,結(jié)果放在內(nèi)存的一塊區(qū)域中,且結(jié)果往往是一個含有多個記錄的集合。游標機制允許用戶在SQL server內(nèi)逐行地訪問這些記錄,按照用戶自己的意愿來顯示和處理這些記錄。
2. 如何使用游標: ???? 一般地,使用游標都遵循下列的常規(guī)步驟: ?????
(1) 聲明游標。把游標與T-SQL語句的結(jié)果集聯(lián)系起來。 ?????
(2) 打開游標。 ????
(3) 使用游標操作數(shù)據(jù)。 ?????
(4) 關(guān)閉游標。
2.1. 聲明游標 DECLARE CURSOR語句SQL-92標準語法格式: DECLARE 游標名 [ INSENSITIVE ] [ SCROLL ] CURSOR FOR sql-statement Eg: Declare MycrsrVar Cursor FOR Select * FROM tbMyData
2.2 打開游標 OPEN MycrsrVar
???? 當游標被打開時,行指針將指向該游標集第1行之前,如果要讀取游標集中的第1行數(shù)據(jù),必須移動行指針使其指向第1行。就本例而言,可以使用下列操作讀取第1行數(shù)據(jù):
???? FETCH FIRST from E1cursor ???? 或 FETCH NEXT from E1cursor
2.3????? 使用游標操作數(shù)據(jù)??? 下面的示例用@@FETCH_STATUS控制在一個WHILE循環(huán)中的游標活動
/* 使用游標讀取數(shù)據(jù)的操作如下。*/
DECLARE E1cursor cursor????? /* 聲明游標,默認為FORWARD_ONLY游標 */
FOR SELECT * FROM c_example OPEN E1cursor??????????????? /* 打開游標 */
FETCH NEXT from E1cursor???? /* 讀取第1行數(shù)據(jù)*/
WHILE @@FETCH_STATUS = 0???? /* 用WHILE循環(huán)控制游標活動 */ BEGIN ?????????
FETCH NEXT from E1cursor?? /* 在循環(huán)體內(nèi)將讀取其余行數(shù)據(jù) */
END CLOSE E1cursor?????????????? /* 關(guān)閉游標 */
DEALLOCATE E1cursor????????? /* 刪除游標 */
2.4???? 關(guān)閉游標 ????
使用CLOSE語句關(guān)閉游標 CLOSE { { [ GLOBAL ] 游標名 } | 游標變量名 }
使用DEALLOCATE語句刪除游標,其語法格式如下: DEALLOCATE { { [ GLOBAL ] 游標名 } | @游標變量名
3. FETCH操作的簡明語法如下:
FETCH ???????????
[ NEXT | PRIOR | FIRST | LAST] FROM { 游標名 | @游標變量名 } [ INTO @變量名 [,…] ] 參數(shù)說明:
NEXT?? 取下一行的數(shù)據(jù),并把下一行作為當前行(遞增)。由于打開游標后,行指針是指向該游標第1行之前,所以第一次執(zhí)行FETCH NEXT操作將取得游標集中的第1行數(shù)據(jù)。NEXT為默認的游標提取選項。 INTO @變量名[,…] 把提取操作的列數(shù)據(jù)放到局部變量中。列表中的各個變量從左到右與游標結(jié)果集中的相應(yīng)列相關(guān)聯(lián)。各變量的數(shù)據(jù)類型必須與相應(yīng)的結(jié)果列的數(shù)據(jù)類型匹配或是結(jié)果列數(shù)據(jù)類型所支持的隱性轉(zhuǎn)換。變量的數(shù)目必須與游標選擇列表中的列的數(shù)目一致。
--------------------------------------------------------------------------------------------------------------------------------
每執(zhí)行一個FETCH操作之后,通常都要查看一下全局變量@@FETCH_STATUS中的狀態(tài)值,以此判斷FETCH操作是否成功。該變量有三種狀態(tài)值:
· 0 表示成功執(zhí)行FETCH語句。 · -1 表示FETCH語句失敗,例如移動行指針使其超出了結(jié)果集。 · -2 表示被提取的行不存在。
由于@@FETCH_STATU是全局變量,在一個連接上的所有游標都可能影響該變量的值。因此,在執(zhí)行一條FETCH語句后,必須在對另一游標執(zhí)行另一FETCH 語句之前測試該變量的值才能作出正確的判斷。
轉(zhuǎn)載于:https://www.cnblogs.com/zhangdp/archive/2012/12/22/2829544.html
總結(jié)
以上是生活随笔為你收集整理的在SqlServer存储过程中使用Cursor(游标)操作记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 写代码的一点感悟
- 下一篇: 一个多线程和队列的实例演示