如果我在TRY中打开一个游标,那么我应该在哪里关闭它



如果我有这个:

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后返回的方式,这是编码返回的正常方式

感谢

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

BOL:中LOCAL的含义

指定光标的范围是批的本地范围,存储过程或创建光标的触发器。光标名称仅在此范围内有效。本地可以引用光标批处理、存储过程或触发器中的游标变量,或存储过程OUTPUT参数。OUTPUT参数用于传递将本地光标移回调用批处理、存储过程,或触发器,可以将参数分配给在存储过程终止后引用光标。光标当批处理、存储过程或触发器终止,除非在OUTPUT参数中传回游标。如果它在OUTPUT参数中传递回来,则游标被解除分配当引用它的最后一个变量被解除分配或超出时范围

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

我会在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

您需要关闭已经声明的块内的光标,即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

最新更新