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

SQL Server 檢視目前開啟的 Cursor:三種 DMV/命令完整比較

     編輯:關於SqlServer

排查「Cursor with name 'xxx' already exists」錯誤,需檢視目前作用中游標。提供三種方法對比:

方法一:sys.dm_exec_cursors(推薦、資訊最豐富)

SELECT 
    ec.session_id,
    ec.name,
    ec.properties,
    ec.creation_time,
    ec.is_open,
    ec.writes,
    ec.reads,
    t.text AS sql_text
FROM sys.dm_exec_cursors(0) ec
CROSS APPLY sys.dm_exec_sql_text(ec.sql_handle) t;
  • 參數 0 代表所有 Session;可指定 session_id 篩選。
  • 回傳游標名稱、屬性(FORWARD_ONLY/STATIC 等)、建立時間、開啟狀態、讀寫計數、完整 T-SQL 文本。

方法二:DBCC ACTIVECURSORS(舊版、輕量)

DBCC ACTIVECURSORS(0);  -- 0 為所有 SPID

僅顯示 SPID、游標名稱、類型、狀態,無 T-SQL 文本,適合快速掃描。

方法三:MASTER..SYSCURSORS(舊版系統表、不建議生產使用)

SELECT * FROM MASTER..SYSCURSORS;

內部實作細節,欄位晦澀,僅供內部除錯參考。

實測範例輸出

sys.dm_exec_cursors 輸出範例

圖中顯示 vend_cursor 為 FORWARD_ONLY STATIC、is_open=1、對應 T-SQL 為 DECLARE vend_cursor CURSOR FOR SELECT * FROM Purchasing.Vendor。

最佳實務建議

  1. 優先用 sys.dm_exec_cursors 取得完整上下文(SQL 文本、Session ID)。
  2. 搭配 sys.dm_exec_sessions 關聯登入資訊、應用程式名稱。
  3. 開發規範:務必 CLOSE + DEALLOCATE 游標,避免洩漏佔用資源。
  4. 長時間執行的游標考慮改用 WHILE 迴圈或集合式操作。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved