打開游標游標在聲明以後,如果要從游標中讀取數據必須打開游標。打開一個Transact-SQL服務器游標使用OPEN 命令,其語法規則為:
OPEN { { [GLOBAL] cursor_name } | cursor_variable_name}
各參數說明如下:
•GLOBAL
定義游標為一全局游標。
•cursor_name
為聲明的游標名字。如果一個全局游標和一個局部游標都使用同一個游標名,則如果使用GLOBAL 便表明其為全局游標,否則表明其為局部游標。
•cursor_variable_name
為游標變量。當打開一個游標後時,MS SQL SERVER 首先檢查聲明游標的語法是否正確,如果游標聲明中有變量,則將變量值帶入。
在打開游標時,如果游標聲明語句中使用了INSENSITIVE 或STATIC 保留字,則OPEN產生一個臨時表來存放結果集;如果在結果集中任何一行數據的大小超過MS SQL SERVER定義的最大行尺寸時,OPEN 命令將失敗;如果聲明游標時作用了KEYSET 選項,則OPEN 產生一個臨時表來存放鍵值。所有的臨時表都存在tempdb 數據庫中。
在游標被成功打開之後,@@CURSOR_ROWS 全局變量將用來記錄游標內數據行數。為了提高性能,MS SQL SERVER 允許以異步方式從基礎表向KEYSET 或靜態游標讀入數據,即如果MS SQL SERVER 的查詢優化器估計從基礎表中返回給游標的數據行已經超過sp_configure cursor threshold 參數值,則MS SQL SERVER 將啟動另外一個獨立的線程來繼續從基礎表中讀入符合游標定義的數據行,此時可以從游標。中讀取數據進行處理而不必等到所有的符合游標定義的數據行都從基礎表中讀入游標 @@CURSOR_ROWS 變量存儲的正是在調用@@CURSOR_ROWS 時,游標已從基礎表讀入的數據行。@@CURSOR_ROWS 的返回值有以下四個,如表13-1 所示。
如果所打開的游標在聲明時帶有SCROLL 或INSENSITIVE 保留字,那麼@@CURSOR_ROWS 的值為正數且為該游標的所有數據行。如果未加上這兩個保留字中的一個,則@@CURSOR_ROWS 的值為-1, 說明該游標內只有一條數據記錄。