Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法在SQL server中获取打开/分配的游标列表?_Sql_Sql Server_Cursor_Sql Server 2000 - Fatal编程技术网

有没有办法在SQL server中获取打开/分配的游标列表?

有没有办法在SQL server中获取打开/分配的游标列表?,sql,sql-server,cursor,sql-server-2000,Sql,Sql Server,Cursor,Sql Server 2000,我有一个存储过程,可以创建和打开一些游标。它会在最后关闭它们,但如果遇到错误,这些游标将保持打开状态!然后,当它尝试创建游标时,后续运行失败,因为名称为的游标已经存在 是否有一种方法可以查询哪些游标存在,以及它们是否打开,以便关闭和取消分配它们?我觉得这比盲目地试图关闭并吞下错误要好。有关如何查找游标的信息。我从来没有用过它们,因为我可以想出一种方法来完成它,而不用一排一排地折磨 您应该将sp重建为 不要使用游标(我们可以提供帮助)- 几乎总有一种方法可以解决这个问题 避免(RBAR) 在事务

我有一个存储过程,可以创建和打开一些游标。它会在最后关闭它们,但如果遇到错误,这些游标将保持打开状态!然后,当它尝试创建游标时,后续运行失败,因为名称为的游标已经存在

是否有一种方法可以查询哪些游标存在,以及它们是否打开,以便关闭和取消分配它们?我觉得这比盲目地试图关闭并吞下错误要好。

有关如何查找游标的信息。我从来没有用过它们,因为我可以想出一种方法来完成它,而不用一排一排地折磨

您应该将sp重建为

  • 不要使用游标(我们可以提供帮助)- 几乎总有一种方法可以解决这个问题 避免(RBAR)

  • 在事务中构建它,并在出现故障或检测到错误时回滚它。这里有一些关于这方面的优秀文章。及

如果您有SQL2005,还可以使用

编辑(回应您的帖子):理想情况下,数据生成最好在应用程序级别处理,因为它们更适合于非基于集合的操作


RedGate有一个我以前使用过的(对于单表来说很好,但是如果有很多FK或一个大的[标准化]数据库,则需要进行一些配置)

这似乎对我有用:

CREATE PROCEDURE dbo.p_cleanUpCursor @cursorName varchar(255) AS
BEGIN

    DECLARE @cursorStatus int
    SET @cursorStatus =  (SELECT cursor_status('global',@cursorName))

    DECLARE @sql varchar(255)
    SET @sql = ''

    IF @cursorStatus > 0
        SET @sql = 'CLOSE '+@cursorName

    IF @cursorStatus > -3
        SET @sql = @sql+' DEALLOCATE '+@cursorName

    IF @sql <> ''
        exec(@sql)

END
创建过程dbo.p_cleanUpCursor@cursorName varchar(255)作为
开始
声明@cursorStatus int
设置@cursorStatus=(选择光标\状态('global',@cursorName))
声明@sql varchar(255)
设置@sql=''
如果@cursorStatus>0
SET@sql='CLOSE'+@cursorName
如果@cursorStatus>-3
SET@sql=@sql+'DEALLOCATE'+@cursorName
如果@sql“”
exec(@sql)
结束
您可以使用sp\u cursor\u list系统存储过程来获取列表 当前连接可见的游标的数目,以及 sp\u描述光标sp\u描述光标列,以及 sp\u描述光标\u表以确定光标的特征 光标


(from)

这是一款在2008R2上运行的产品,在此之前没有进行过任何测试:

USE MASTER
GO
select s.session_id, s.host_name, s.program_name, s.client_interface_name, s.login_name
, c.cursor_id, c.properties, c.creation_time, c.is_open, con.text,
l.resource_type, d.name, l.request_type, l.request_Status, l.request_reference_count, l.request_lifetime, l.request_owner_type
from sys.dm_exec_cursors(0) c
left outer join (select * from sys.dm_exec_connections c cross apply sys.dm_exec_sql_text(c.most_recent_sql_handle) mr) con on c.session_id = con.session_id
left outer join sys.dm_exec_sessions s on s.session_id = c.session_id
left outer join sys.dm_tran_locks l on l.request_session_id = c.session_id
left outer join sys.databases d on d.database_id = l.resource_database_id
你可以用

sys.dm_exec_游标

如上所述

基本上,您可以运行此示例查询并获取有关在各种数据库中打开的游标的信息

sys.dm_exec_游标(0)