遊標
一、遊標是一種從表中檢索數據並進行操做的靈活手段,遊標主要用在服務器上,處理由客戶端發送給服務端的sql語句,或是批處理、存儲過程、觸發器中的數據處理請求。遊標的優勢在於它能夠定位到結果集中的某一行,並能夠對該行數據執行特定操做。一個完整的遊標由5部分組成:
(1)聲明遊標 (2)打開遊標 (3)從一個遊標中查找信息 (4)關閉遊標 (5)釋放遊標
二、在性能上,遊標會吃更多的內存,減小可用的併發,佔用寬帶,鎖定資源還有更多的代碼量。但是爲何學習遊標呢?html
1 現存系統有一些遊標,咱們查詢必須經過遊標來實現
2 做爲一個備用方式,當咱們窮盡了while循環,子查詢,臨時表,表變量,自建函數或其餘方式仍然沒法實現某些查詢的時候用遊標來實現。
三、聲明遊標語法
declare cursor_name [global/local] cursor for
select * from table1
go
全局遊標global在批處理結束後依然有效,局部遊標local在批處理結束後被隱式釋放,沒法在其餘批處理中調用,默認是global
四、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是4sql
五、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 鎖定任何數據,當須要在遊標中更新數據時,若是底層表數據更新,則遊標內數據更新不成功,若是,底層表數據未更新,則遊標內表數據能夠更新
2、 打開遊標
open test_cursor 注意當全局遊標和局部遊標變量重名時,默認會打開局部變量遊標
併發
3、使用遊標函數
遊標常常會和全局變量@@FETCH_STATUS與WHILE循環來共同使用,以達到遍歷遊標所在數據集的目的,例如:sqlserver
@@fetch_status 是一個全局變量
返回上一次使用遊標fetch操做所返回的狀態值性能
0 fetch語句成功學習
-1 fetch語句失敗或者此行不在結果集中
-2 被提取的行不存在fetch
4、關閉遊標
close+遊標名稱
5、釋放遊標
deallocate+遊標名稱
本文來自:http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html
參考書籍:sqlserver 從入門到精通