代码之家  ›  专栏  ›  技术社区  ›  Aaron Silverman

有什么方法可以在SQL server中获取打开/分配的游标列表吗?

  •  8
  • Aaron Silverman  · 技术社区  · 16 年前

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

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

    5 回复  |  直到 3 年前
        1
  •  2
  •   StingyJack    16 年前

    这似乎对我有效:

    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
    
        2
  •  2
  •   Aaron Silverman    16 年前

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

    您应该将sp重建为

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

    • 在事务中构建它,如果出现故障或检测到错误,则将其回滚。这里有一些关于这方面的优秀文章。 part 1 part 2

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

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

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

        3
  •  2
  •   BlackICE    12 年前

    这在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
    
        4
  •  0
  •   riofly    12 年前

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

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

        5
  •  0
  •   nzrytmn    7 年前

    您可以使用

    sys.dmexec_cursors

    描述 here

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

    系统dmexec_cursors(0)