游標允許逐行處理結果集,適用於需逐筆邏輯判斷的複雜作業。SQL Server 2000 支援 SQL-92 標準語法與 T-SQL 擴充語法兩種宣告方式。
DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR
FOR select_statement
[FOR {READ ONLY | UPDATE [OF column_name [,...n]]}]
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]]]
| 選項 | 說明 |
|---|---|
| LOCAL / GLOBAL | 游標作用域:LOCAL 僅限批次/預存程序/觸發器;GLOBAL 連接層級可見。 |
| FORWARD_ONLY | 僅支援 NEXT 擷取,效能最佳,不可搭配 SCROLL。 |
| STATIC | 建立暫存資料複本,不反映基礎資料變更,唯讀。 |
| KEYSET | 固定鍵值集合,非鍵值更新可見,插入不可見。 |
| DYNAMIC | 反映所有資料變更,支援絕對/相對擷取,成本最高。 |
| FAST_FORWARD | FORWARD_ONLY + READ_ONLY 最佳化組合,效能最好。 |
| READ_ONLY | 禁止透過游標更新資料。 |
| SCROLL_LOCKS | 擷取時鎖定資料列,確保更新成功。 |
| OPTIMISTIC | 使用時間戳記/版本檢查樂觀並行控制。 |
DECLARE my_cursor CURSOR FAST_FORWARD FOR SELECT id, name FROM customers
OPEN my_cursor
FETCH NEXT FROM my_cursor INTO @id, @name
WHILE @@FETCH_STATUS = 0
BEGIN
-- 處理邏輯
FETCH NEXT FROM my_cursor INTO @id, @name
END
CLOSE my_cursor
DEALLOCATE my_cursor
建議: 能用集合式操作 (JOIN、子查詢) 解決時,優先避免使用游標以提升效能。