首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

MS SQL Server DECLARE CURSOR 完整語法與選項詳解

     編輯:關於SqlServer

每個游標必須經過四個階段:DECLARE → OPEN → FETCH → CLOSE/DEALLOCATE。宣告游標時需指定名稱、資料來源(SELECT 語句)、篩選條件與屬性(唯讀/可更新)。

標準語法 (ISO/SQL-92)

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 定位更新。

T-SQL 擴充語法選項 (常用)

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_FORWARDFORWARD_ONLY + READ_ONLY 最佳化,效能最佳單向唯讀逐列處理

實務建議

  • 預設使用 LOCAL FAST_FORWARD,除非確實需要捲動或更新。
  • 需更新時明確指定 FOR UPDATE OF column_list 以減少鎖定範圍。
  • 避免在高併發核心交易中使用游標,改用集合式操作。

總結

精準選擇游標類型與選項,是平衡功能需求(捲動、更新、並行控制)與效能的關鍵。熟悉各選項行為差異,才能寫出健壯、高效的 T-SQL 游標程式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved