排查「Cursor with name 'xxx' already exists」錯誤,需檢視目前作用中游標。提供三種方法對比:
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 篩選。DBCC ACTIVECURSORS(0); -- 0 為所有 SPID
僅顯示 SPID、游標名稱、類型、狀態,無 T-SQL 文本,適合快速掃描。
SELECT * FROM MASTER..SYSCURSORS;
內部實作細節,欄位晦澀,僅供內部除錯參考。

圖中顯示 vend_cursor 為 FORWARD_ONLY STATIC、is_open=1、對應 T-SQL 為 DECLARE vend_cursor CURSOR FOR SELECT * FROM Purchasing.Vendor。
sys.dm_exec_cursors 取得完整上下文(SQL 文本、Session ID)。sys.dm_exec_sessions 關聯登入資訊、應用程式名稱。CLOSE + DEALLOCATE 游標,避免洩漏佔用資源。WHILE 迴圈或集合式操作。