每個游標必須經過四個階段:DECLARE → OPEN → FETCH → CLOSE/DEALLOCATE。宣告游標時需指定名稱、資料來源(SELECT 語句)、篩選條件與屬性(唯讀/可更新)。
DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR
FOR select_statement
[FOR {READ ONLY | UPDATE [OF column_name [,...n]]}]
| 選項 | 功能 |
|---|---|
INSENSITIVE | 將結果集複製到 tempdb 暫存表,基礎表變更不影響游標;游標不可更新基礎表。若 SELECT 含 DISTINCT、GROUP BY、UNION、OUTER JOIN、無索引表或計算欄位,系統自動套用此選項。 |
SCROLL | 啟用所有 FETCH 導向(FIRST, LAST, PRIOR, NEXT, ABSOLUTE, RELATIVE)。未指定時僅支援 NEXT。 |
select_statement | 定義結果集的 SELECT 語句。不可使用 COMPUTE, COMPUTE BY, FOR BROWSE, INTO。 |
READ ONLY | 游標不可更新。若未指定 UPDATE 子句且查詢非唯讀,預設為可更新。 |
UPDATE [OF column_list] | 指定可更新的欄位,啟用 WHERE CURRENT OF 定位更新。 |
DECLARE cursor_name CURSOR [LOCAL | GLOBAL] [FORWARD_ONLY | SCROLL] [STATIC | KEYSET | DYNAMIC | FAST_FORWARD] [READ_ONLY | SCROLL_LOCKS | OPTIMISTIC] [TYPE_WARNING] FOR select_statement [FOR UPDATE [OF column_name [,...n]]]
| 類型 | 特性 | 適用場景 |
|---|---|---|
| STATIC | 結果集固定於暫存表,不反映基礎表變更 | 報表、唯讀查詢 |
| KEYSET | 鍵值固定,非鍵值欄位反映基礎表變更 | 需感知資料變更的捲動查詢 |
| DYNAMIC | 完全反映基礎表所有變更,支援 ABSOLUTE 除外 | 高併發、需即時資料 |
| FAST_FORWARD | FORWARD_ONLY + READ_ONLY 最佳化,效能最佳 | 單向唯讀逐列處理 |
LOCAL FAST_FORWARD,除非確實需要捲動或更新。FOR UPDATE OF column_list 以減少鎖定範圍。精準選擇游標類型與選項,是平衡功能需求(捲動、更新、並行控制)與效能的關鍵。熟悉各選項行為差異,才能寫出健壯、高效的 T-SQL 游標程式。