2015-02-12 29 views
3

如果我有这样的:如果我在一个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 

我应该关闭游标的尝试里面或者它没有关系。我不确定的是,如果我的代码进入CATCH,那么光标可能不会关闭。

这是如何处理的?也是他们的方式我有CATCH后,我回到正常途径代码的返回

感谢

+0

了'结束try' – 2015-02-12 06:24:02

+0

所以后来如果我的代码中有一个例外是它没关系光标将不会关闭前? – 2015-02-12 06:25:02

+0

如果在达到关闭命令之前出错,该怎么办? – 2015-02-12 06:25:02

回答

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 
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 
2

如果不需要将它们设置为全局,则应该将游标定义为LOCAL。从BOL的LOCAL

含义:

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

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

+1

同样使用FORWARD_ONLY和READ ONLY(或FAST_FORWARD),当你需要这是一个好的做法。它会使游标快得多。 – 2015-02-12 06:32:21

+0

詹姆斯 - 感谢这些建议。是的,在这种情况下,我只需要只读和转发。你能展示如何使用这些东西吗? – 2015-02-12 06:33:44

相关问题