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

SQL Server 游標宣告完整語法規範:SQL-92 標準與 MS SQL Server 擴展語法深度對比

     編輯:關於SqlServer

每個游標必須包含四大關鍵部分,順序固定:

  1. DECLARE 游標
  2. OPEN 游標
  3. 從游標 FETCH 資訊
  4. CLOSE 或 DEALLOCATE 游標

使用 DECLARE 宣告游標主要包含:游標名稱、資料來源(表與欄位)、選取條件、屬性(唯讀或可修改)。

SQL-92 標準游標語法

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 腳本使用時必須指定名稱

MS SQL Server 擴展游標語法:增強功能保留字

擴展保留字詳細說明

  • LOCAL:作用域僅限宣告所在的存儲過程、觸發器或批次。建立游標的存儲過程結束後游標自動釋放。常用 OUTPUT 傳遞給呼叫者,直到最後引用者釋放時才自動釋放
  • GLOBAL:作用域為整個會話層(用戶連接時間)。整個會話層任何存儲過程、觸發器、批次均可使用,用戶脫離資料庫時自動釋放。注意: 未指定 GLOBAL/LOCAL 時,SQL Server 使用 default local cursor 資料庫選項(為相容舊版常設為 FALSE)
  • FORWARD_ONLY:僅能按順序從第一行到最後一行提取,僅能用 FETCH NEXT。除非使用 STATIC、KEYSET、DYNAMIC 關鍵字,否則未指定時 FORWARD_ONLY 為預設。使用 FORWARD_ONLY 時不可用 FAST_FORWARD
  • STATIC:同 INSENSITIVE,資料存入 tempdb 臨時表,基礎表修改不影響游標,無法透過游標更新基礎表
  • KEYSET:游標開啟時欄位順序固定,在 tempdb 建立鍵值表。非鍵值資料修改可反映至游標。他人新增符合範圍資料無法讀取(T-SQL 伺服器游標不支援 INSERT)。讀取已刪除行時 @@FETCH_STATUS 返回 -2。更新操作含刪除舊資料+插入新資料,讀取舊資料返回 -2,新資料不可見;但用 WHERE CURRENT OF 時新行可見。注意: 基礎表無唯一索引或主鍵時,KEYSET 退化為 STATIC
  • DYNAMIC:基礎表變化反映至游標,最大程度保證資料一致性。但比 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_ONLY
    • STATIC、FAST_FORWARD 類型預設 READ_ONLY
    • DYNAMIC、KEYSET 類型預設 OPTIMISTIC
  • 僅能在 T-SQL 語句中引用游標,不可在資料庫 API 函數中引用
  • 宣告後可透過系統程序設定特性
  • 有權對視圖/表/欄位執行 SELECT 的用戶,具備使用游標的預設權限

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