5

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

有没有办法可以查询存在哪些游标以及它们是否打开,以便我可以关闭并释放它们?我觉得这比盲目地试图关闭和吞下错误要好。

4

5 回答 5

2

在此处查找有关如何查找游标的信息。我从来没有使用过它们中的任何一个,因为我可以找到一种方法来完成它,而无需逐行逐行。

您应该将 sp 重建为

  • 不使用游标(我们可以提供帮助 - 几乎总有办法避免 RBAR)

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

如果你有SQL2005,你也可以使用try catch

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

Red Gate 有一个我以前使用过的SQL 数据生成器(它非常适合单表,但如果您有很多 FK 或宽 [规范化] 数据库,则需要进行一些配置)。

于 2008-11-05T16:10:11.277 回答
2

这似乎对我有用:

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
于 2008-11-10T15:19:50.177 回答
2

这适用于 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
于 2013-04-23T19:25:21.893 回答
0

您可以使用sp_cursor_list系统存储过程来获取对当前连接可见的游标列表,并 使用 sp_describe_cursorsp_describe_cursor_columnssp_describe_cursor_tables来确定游标的特征。

(来自http://msdn.microsoft.com/it-it/library/aa172595(v=sql.80).aspx

于 2013-01-15T13:03:28.867 回答
0

您可以使用

sys.dm_exec_cursors

如此处所述

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

sys.dm_exec_cursors(0)

于 2018-08-08T11:00:48.780 回答