游標若未正確 `CLOSE`/`DEALLOCATE` 會佔用記憶體、鎖定資源、導致連線洩漏。SQL Server 提供動態管理函數 sys.dm_exec_cursors 即時檢視所有開啟/已關閉未釋放的游標。本文示範模擬洩漏場景、查詢腳本與長時間游標排查實務。
DECLARE Cursor_Test CURSOR FOR SELECT * FROM dbo.TEST;
OPEN Cursor_Test;
-- 故意不執行 CLOSE / DEALLOCATE
SELECT
session_id,
cursor_id,
name,
creation_time,
is_open
FROM sys.dm_exec_cursors(0)
WHERE is_open = 1;
關鍵欄位:

工作階段 1 執行 `CLOSE Cursor_Test;` (不 DEALLOCATE) → 再查 `is_open = 0` 即可見。

SELECT
c.creation_time,
c.cursor_id,
c.name,
c.session_id,
s.login_name,
c.is_open
FROM sys.dm_exec_cursors(0) AS c
JOIN sys.dm_exec_sessions AS s ON c.session_id = s.session_id
WHERE DATEDIFF(HOUR, c.creation_time, GETDATE()) > 1;
BEGIN TRY
DECLARE c CURSOR LOCAL FOR ...; OPEN c; ...
END TRY
BEGIN CATCH
IF CURSOR_STATUS('global','c') >= 0 BEGIN CLOSE c; DEALLOCATE c; END
THROW;
END CATCH
5. ✅ 定期巡檢:納入每日健康檢查腳本,警報 `is_open=1` 超過閾值 (如 30 分鐘) 的游標。
掌握 `sys.dm_exec_cursors` 即時可視化,配合 `LOCAL` 游標與 `TRY/CATCH` 保護,即可從根源杜絕游標洩漏風險。