SQL Server里面如何檢查沒有釋放的游標


    一直以來對SQL SERVER的游標都不怎么感冒,也很少使用SQL Server里面的游標,前幾天有一位網友問如何檢查數據庫里面沒有釋放的游標,覺得有點意思,就測試驗證了一下,順便整理於此。

   會話1:我們模擬一個應用程序或腳本,在打開游標后,忘記關閉、釋放游標。

DECLARE Cursor_Test CURSOR FOR
SELECT * FROM dbo.TEST;
OPEN Cursor_Test;

   此時如果我們如何檢查數據庫里面沒有釋放的游標?其實SQL SERVER提供了一個動態管理函數sys.dm_exec_cursors,它返回有關在各種數據庫中打開的游標的信息。

SELECT * FROM sys.dm_exec_cursors(0)

    關於該動態管理函數返回的表的各個字段的解釋,可以參考MSDN文檔。不同數據庫版有所區別。如果要查詢沒有關閉的游標,則需要對字段is_open進行過濾(指定游標是否處於打開狀態。1為打開,0表示關閉)

    會話2:查看沒有關閉的游標

SELECT  session_id ,
        cursor_id ,
        name ,
        creation_time ,
        is_open
FROM    sys.dm_exec_cursors(0)
WHERE   is_open = 1;

clipboard

    如果想查看已經關閉,但是沒有釋放的游標,可以在會話1執行關閉游標命令CLOSE Cursor_Test;但是不釋放游標,如下截圖所示

clipboard[1]

    另外,可以用下面SQL查看服務器上打開時間超過指定時間(1 小時)的游標的信息,根據需要自行調整查詢條件。

SELECT   creation_time
        ,cursor_id 
        ,name 
        ,c.session_id 
        ,login_name 
        ,c.creation_time 
        ,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(hh, c.creation_time, GETDATE()) > 1;
GO

 

參考資料

        https://msdn.microsoft.com/zh-cn/library/ms190346(v=sql.105).aspx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM