如果我在旁边打开一个光标,那么我应该在哪里关闭它?

时间:2015-02-12 06:20:30

标签: sql-server

如果我有这个:

BEGIN TRY

OPEN CUR1
   FETCH NEXT FROM CUR INTO ...



END TRY
BEGIN CATCH
   SET @RC = 1
   SET @ErrorMessage = ERROR_MESSAGE()
   RETURN
END CATCH

SET @RC = 0
RETURN

我应该关闭try中的Cursor还是无所谓。我不确定的是,如果我在try中的代码进入CATCH,那么光标可能无法关闭。

这通常是如何处理的?他们也是我在CATCH之后使用RETURN编程返回

的正常方式

由于

3 个答案:

答案 0 :(得分:2)

如果不需要将游标设置为全局游标,则应将游标定义为LOCAL。

来自BOL的LOCAL的含义:

  

指定游标的范围是批处理的本地范围,存储   过程或创建光标的触发器。光标名称   仅在此范围内有效。游标可以由本地引用   批处理,存储过程或触发器中的游标变量,或者a   存储过程OUTPUT参数。 OUTPUT参数用于传递   本地光标返回调用批处理,存储过程或   trigger,可以将参数赋值给游标变量   存储过程终止后引用游标。光标   批处理,存储过程或触发器时隐式解除分配   除非光标在OUTPUT参数中传回,否则终止。   如果在OUTPUT参数中传回,则会释放游标   当引用它的最后一个变量被解除分配或退出时   范围。

https://msdn.microsoft.com/en-us/library/ms180169.aspx

答案 1 :(得分:1)

我会先关闭它END TRY。另外,我会添加一个检查光标是否仍然打开,如果是,则关闭它。有关详细信息,请参阅此处:http://www.sqlservercentral.com/Forums/Topic767778-338-1.aspx

BEGIN TRY

OPEN CUR1
   FETCH NEXT FROM CUR INTO ...

CLOSE CUR1
DEALLOCATE test_cursor

END TRY
BEGIN CATCH
    SET @curStatus = Cursor_Status('local', 'CUR1'); --set it to LOCAL above, if using global above change here too
    IF @curStatus >= 0 
    BEGIN
        CLOSE objectsCur;
        DEALLOCATE objectsCur;
    END
    ELSE IF @curStatus = -1 --may have been closed already so just deallocate
    BEGIN
        DEALLOCATE objectsCur;
    END
END CATCH

答案 2 :(得分:1)

您需要关闭已声明的块内的游标,即TRY,但它也应该在错误处理程序中释放,即catch部分;

BEGIN TRY

OPEN CUR1
   FETCH NEXT FROM CUR INTO ...


CLOSE CUR1;
DEALLOCATE CUR1;

END TRY
BEGIN CATCH
   SET @RC = 1
   SET @ErrorMessage = ERROR_MESSAGE()
   CLOSE CUR1;
   DEALLOCATE CUR1;
   RETURN
END CATCH

SET @RC = 0
RETURN