游標
1、游標是一種從表中檢索數據並進行操作的靈活手段,游標主要用在服務器上,處理由客戶端發送給服務端的sql語句,或是批處理、存儲過程、觸發器中的數據處理請求。游標的優點在於它可以定位到結果集中的某一行,並可以對該行數據執行特定操作。一個完整的游標由5部分組成:
(1)聲明游標 (2)打開游標 (3)從一個游標中查找信息 (4)關閉游標 (5)釋放游標
2、在性能上,游標會吃更多的內存,減少可用的並發,占用寬帶,鎖定資源還有更多的代碼量。可是為什么學習游標呢?
1 現存系統有一些游標,我們查詢必須通過游標來實現
2 作為一個備用方式,當我們窮盡了while循環,子查詢,臨時表,表變量,自建函數或其他方式仍然無法實現某些查詢的時候用游標來實現。
3、聲明游標語法
declare cursor_name [global/local] cursor for
select * from table1
go
全局游標global在批處理結束后依然有效,局部游標local在批處理結束后被隱式釋放,無法在其他批處理中調用,默認是global
4、forword_only 和scroll 二選一 默認是forword_only
declare test_cursorname cursor forword_only for
select * from table1
go
open test_cursorname
fetch next from test_cursorname
默認和forword_only 只支持fetch next選項,不支持游標向后或者走向特定位置
declare test_cursorname2 cursor scoll for
select * from table1
go
open test_cursorname
fetch next from test_cursorname2
fetch last from test_cursorname2
first:取第一行數據
last: 取最后一行數據
prior:取前一行數據
next: 取后一行數據
relative: 按相對位置取數據
absolute:按絕對位置取數據 fetch absolute 3 from TestCursor4 相對於本行向后數三行,比如現在id1,執行完成id是4
5、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性能略好.
6、read_only scroll_locks optimistic 三選一
read_only 意味着聲明的游標只能讀取數據,游標不能做任何更新操作
scroll_locks是另一種極端,將讀入游標的所有數據進行鎖定,防止其他程序進行更改,以確保更新的絕對成功
optimistic是相對比較好的一個選擇,optimistic 鎖定任何數據,當需要在游標中更新數據時,如果底層表數據更新,則游標內數據更新不成功,如果,底層表數據未更新,則游標內表數據可以更新
二、 打開游標
open test_cursor 注意當全局游標和局部游標變量重名時,默認會打開局部變量游標
三、使用游標
游標經常會和全局變量@@FETCH_STATUS與WHILE循環來共同使用,以達到遍歷游標所在數據集的目的,例如:
@@fetch_status 是一個全局變量
返回上一次使用游標fetch操作所返回的狀態值
0 fetch語句成功
-1 fetch語句失敗或者此行不在結果集中
-2 被提取的行不存在
四、關閉游標
close+游標名稱
五、釋放游標
deallocate+游標名稱
本文來自:http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html
參考書籍:sqlserver 從入門到精通