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

时间:2008-11-05 16:02:12

标签: sql sql-server cursor sql-server-2000

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

有没有办法可以查询哪些游标存在以及它们是否打开所以我可以关闭它们并取消分配它们?我觉得这比盲目地试图关闭并吞下错误更好。

5 个答案:

答案 0 :(得分:2)

Look here有关如何查找游标的信息。我从来没有使用它们中的任何一个,因为我可以找到一种方法来完成它而不用去按行Agonizing Row。

您应该将sp重建为

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

  • 在事务中构建它,如果发生故障或者您检测到错误,则将其回滚。这里有一些很好的文章。 part 1part 2

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

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

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

答案 1 :(得分: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

答案 2 :(得分:1)

这似乎对我有用:

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

答案 3 :(得分:0)

  

您可以使用 sp_cursor_list 系统存储过程来获取列表   当前连接可见的游标,以及    sp_describe_cursor sp_describe_cursor_columns ,以及    sp_describe_cursor_tables 来确定一个特征   光标。

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

答案 4 :(得分:0)

您可以使用

  

sys.dm_exec_cursors

here

所述

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

  

sys.dm_exec_cursors(0)