如何在存储过程判断游标是否被释放,静态游标可以实现吗?

解决方案 »

  1.   

    最后
    DEALLOCATE cursor_name ---释放游标
      

  2.   

    @@CURSOR_ROWS 值为0则没有打开的
      

  3.   

    我遇到的问题是在存储中有多个游标,其中有异常返回的,但是没执行后面close 游标和释放游标的命令,我该怎么做呢
      

  4.   


    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
    ALTER PROCEDURE [dbo].[ReleaseCursor] 
    AS
    BEGIN
    SET NOCOUNT ON;
    DECLARE @cnt INT;
    SELECT @cnt=0;
    DECLARE @tbl_cursorname TABLE(id INT IDENTITY(1,1) NOT NULL,curname varchar(128),openstatus INT)

    INSERT @tbl_cursorname(curname,openstatus) --取到所有的游标名字和是否打开,打开 1,关闭 0
    SELECT a.cursor_name,a.open_status 
    FROM sys.syscursors a DECLARE @rowcnt INT,@i INT;
    SELECT @rowcnt=count(*) FROM @tbl_cursorname;
    SELECT @i=1;
    DECLARE @cursorname VARCHAR(128),@openstatus INT; WHILE @i<=@rowcnt
    BEGIN
    SELECT @cursorname=curname,@openstatus=openstatus 
    FROM @tbl_cursorname
    WHERE id=@i;
    SELECT @cursorname,@openstatus
    BEGIN TRY
    IF (@openstatus=1) --打开则关闭
    EXEC('CLOSE '+@cursorname);
    EXEC('DEALLOCATE '+@cursorname);
    SET @cnt=@cnt+1;
    END TRY
    BEGIN CATCH
    END CATCH 
    SET @i=@i+1;
    END 
    END
    -- 在存储过程最后调用 exec ReleaseCursor