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;

    如果想查看已经关闭,但是没有释放的游标,可以在会话1执行关闭游标命令CLOSE Cursor_Test;但是不释放游标,如下截图所示

    另外,可以用下面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

  

时间: 2024-12-29 20:08:06

SQL Server里面如何检查没有释放的游标的相关文章

ms sql server缓存清除与内存释放

Sql Server系 统内存管理在没有配置内存最大值,很多时候我们会发现运行Sql Server的系统内存往往居高不下.这是由于他对于内存使用的策略是有多少闲置的内存就占用多少,直到内存使用虑达到系统峰值时(预留内存根据系统默认 预留使用为准,至少4M),才会清除一些缓存释放少量的内存为新的缓存腾出空间. 这些内存一般都是Sql Server运行时候用作缓存的,例如你运行一个select语句, 执行个存储过程,调用函数: 1.数据缓存:执行个查询语句,Sql Server会将相关的数据页(Sq

SQL Server 版本变更检查 警告_MsSql

复制代码 代码如下: 1,退出安装程序, 2,通过开始-->运行-->cmd 3,输入你的 安装程序(step.exe)的路径+ 空格+SKUUPGRADE=1 如: 复制代码 代码如下: C:\Documents and Settings\Administrator>"D:\工具\Microsoft Sql Server 2005 Enter prise\Servers\setup.exe" SKUUPGRADE=1

SQL Server 版本变更检查 警告

复制代码 代码如下: 1,退出安装程序, 2,通过开始-->运行-->cmd 3,输入你的 安装程序(step.exe)的路径+ 空格+SKUUPGRADE=1 如: 复制代码 代码如下: C:\Documents and Settings\Administrator>"D:\工具\Microsoft Sql Server 2005 Enter prise\Servers\setup.exe" SKUUPGRADE=1

SQL Server的通用分页存储过程 未使用游标,速度更快!_MsSql

正常情况下,SQL Server服务器上会对使用频率大的Table建立合适的索引 这样能大幅度的提高数据库本身的数据检索速度,建立索引的方法就不细说了 如果需要返回大量数据,从几百行到几万行,甚至几十万行数据 这时会发现响应速度越来越慢,甚至发生响应超时的错误 为了解决这种大数据量请求的问题,就不得不使用分页模式了 在这方面,JDBC就强悍得多,它可以将指定的行数和SQL请求一并发送给SQL Server,这样只返回分页后的数据,JDBC的原理还不清楚,但在实际使用中,速度还是非常快的 如果没办

SQL Server的通用分页存储过程 未使用游标,速度更快!

正常情况下,SQL Server服务器上会对使用频率大的Table建立合适的索引 这样能大幅度的提高数据库本身的数据检索速度,建立索引的方法就不细说了 如果需要返回大量数据,从几百行到几万行,甚至几十万行数据 这时会发现响应速度越来越慢,甚至发生响应超时的错误 为了解决这种大数据量请求的问题,就不得不使用分页模式了 在这方面,JDBC就强悍得多,它可以将指定的行数和SQL请求一并发送给SQL Server,这样只返回分页后的数据,JDBC的原理还不清楚,但在实际使用中,速度还是非常快的 如果没办

把Oracle数据库移植到Microsoft SQL Server 7.0

oracle|server|数据|数据库  把Oracle数据库移植到Microsoft SQL Server 7.0 摘要:本文是为那些想把自己的Oracle应用程序转换为Microsoft SQL Server应用程序的开发人员编写的.本文描述了一个成功的转换所需要的工具.过程和技术.同时强调了建立高性能.高度并行的SQL Server应用程序的基本的设计要素. 本文的读者应该具有: Oracle关系型数据管理系统(RDBMS)的坚实基础. 普通数据库管理知识. 熟悉Oracle SQL和P

01. SQL Server 如何读写数据

原文:01. SQL Server 如何读写数据 一. 数据读写流程简要SQL Server作为一个关系型数据库,自然也维持了事务的ACID特性,数据库的读写冲突由事务隔离级别控制.无论有没有显示开启事务,事务都是存在的.流程图如下: 数据读写流程图 0. 事务开始(1) 所有DML语句必然是基于事务的,如果没有显式开启事务,即手动写下BEGIN TRAN,SQL Server则把每条语句作为一个事务,并自动提交事务. 也就是说SQL SERVER 默认不开启隐式事务,这点与ORACLE正好相反

数据库疑难讲解:改善SQL Server内存管理

最近,为了能在数据库服务器中运行其他应用程序,在保持数据库操作系统版本不变的前提下对数据库服务器进行了软.硬件上的升级.在软件上,将操作系统从Windows 2000升级到Windows Server 2003;在硬件上,将服务器中的内存由原来的512MB增加到1GB(1024MB). 在升级后的开始几个星期之内,服务器在使用中表现良好.但是不久后就发现,在服务器上同时运行的其他应用程序却出现了异常,不时地报出内存分配不足的警告.经过几次跟踪后发现,原来是SQL Server吞去了大部分内存所致

T-SQL命令在SQL Server查询中的运用

server 首先需要说明的是这篇文章的内容并不是如何调节SQL Server查询性能的(有关这方面的内容能写一本书),而是如何在SQL Server查询性能的调节中利用SET STATISTICS IO和SET STATISTICS TIME这二条被经常忽略的Transact-SQL命令的. 从表面上看,查询性能的调节是一件十分简单的事.从本质上讲,我们希望查询的运行速度能够尽可能地快,无论是将查询运行的时间从10分钟缩减为1分钟,还是将运行的时间从2秒钟缩短为1秒种,我们最终的目标都是减少运