每個游標必須包含四大關鍵部分,順序固定:
DECLARE 游標OPEN 游標FETCH 資訊CLOSE 或 DEALLOCATE 游標使用 DECLARE 宣告游標主要包含:游標名稱、資料來源(表與欄位)、選取條件、屬性(唯讀或可修改)。
DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR
FOR select_statement
[FOR {READ ONLY | UPDATE [OF column_name [,...n]]}]
cursor_name:游標名稱INSENSITIVE:SQL Server 將選取資料存入臨時表(tempdb),讀取操作由臨時表應答。基礎表修改不影響游標資料,游標不隨基礎表變化而變化,**無法透過游標更新基礎表**。未使用此選項時,基礎表更新/刪除會反映至游標。自動觸發 INSENSITIVE 的情況: SELECT 使用 DISTINCT、GROUP BY、HAVING、UNION;使用 OUTER JOIN;選取表無索引;選取欄位為實數值SCROLL:支援所有提取操作(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)。未使用時僅能 NEXT 提取。大幅提升讀取靈活性,可隨意讀取任意行無需關閉重開select_statement:定義結果集的 SELECT 語句。**游標中不可使用 COMPUTE、COMPUTE BY、FOR BROWSE、INTO**READ ONLY:不允許游標資料被更新(預設允許更新)。UPDATE/DELETE 的 WHERE CURRENT OF 子句中不可引用該游標UPDATE [OF column_name[,…n]]:定義可修改欄位,未指定則所有欄位可更新。游標建立後,游標名成為唯一識別,後續存儲過程、觸發器、T-SQL 腳本使用時必須指定名稱

LOCAL:作用域僅限宣告所在的存儲過程、觸發器或批次。建立游標的存儲過程結束後游標自動釋放。常用 OUTPUT 傳遞給呼叫者,直到最後引用者釋放時才自動釋放GLOBAL:作用域為整個會話層(用戶連接時間)。整個會話層任何存儲過程、觸發器、批次均可使用,用戶脫離資料庫時自動釋放。注意: 未指定 GLOBAL/LOCAL 時,SQL Server 使用 default local cursor 資料庫選項(為相容舊版常設為 FALSE)FORWARD_ONLY:僅能按順序從第一行到最後一行提取,僅能用 FETCH NEXT。除非使用 STATIC、KEYSET、DYNAMIC 關鍵字,否則未指定時 FORWARD_ONLY 為預設。使用 FORWARD_ONLY 時不可用 FAST_FORWARDSTATIC:同 INSENSITIVE,資料存入 tempdb 臨時表,基礎表修改不影響游標,無法透過游標更新基礎表KEYSET:游標開啟時欄位順序固定,在 tempdb 建立鍵值表。非鍵值資料修改可反映至游標。他人新增符合範圍資料無法讀取(T-SQL 伺服器游標不支援 INSERT)。讀取已刪除行時 @@FETCH_STATUS 返回 -2。更新操作含刪除舊資料+插入新資料,讀取舊資料返回 -2,新資料不可見;但用 WHERE CURRENT OF 時新行可見。注意: 基礎表無唯一索引或主鍵時,KEYSET 退化為 STATICDYNAMIC:基礎表變化反映至游標,最大程度保證資料一致性。但比 KEYSET、STATIC 需更多游標資源FAST_FORWARD:FORWARD_ONLY + READ_ONLY 型游標,已優化執行。定義 SCROLL 或 FOR_UPDATE 時不可定義此選項SCROLL_LOCKS:鎖置於游標結果集資料上,讀入時即產生鎖。確保更新/刪除操作總能成功。**並發處理考量下應避免使用**。定義 FAST_FORWARD 時不可選此項OPTIMISTIC:資料讀入游標後若已變更,更新/刪除可能失敗。定義 FAST_FORWARD 時不可用TYPE_WARNING:游標類型被修改為非使用者定義類型時,向客戶端發送警告重要限制: **不可將 SQL-92 標準語法與 MS SQL Server 擴展用法混合使用。**
CURSOR 前用 SCROLL 或 INSENSITIVE 時,CURSOR 與 FOR select_statement 間不可使用任何保留字,反之亦然DECLARE CURSOR 宣告時,未選擇 READ_ONLY、OPTIMISTIC、SCROLL_LOCKS 時的預設行為:
SELECT 不支援更新 → 游標為 READ_ONLYSTATIC、FAST_FORWARD 類型預設 READ_ONLYDYNAMIC、KEYSET 類型預設 OPTIMISTICSELECT 的用戶,具備使用游標的預設權限
