如果我有这个:
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编程返回
的正常方式由于
答案 0 :(得分:2)
如果不需要将游标设置为全局游标,则应将游标定义为LOCAL。
来自BOL的LOCAL的含义:
指定游标的范围是批处理的本地范围,存储 过程或创建光标的触发器。光标名称 仅在此范围内有效。游标可以由本地引用 批处理,存储过程或触发器中的游标变量,或者a 存储过程OUTPUT参数。 OUTPUT参数用于传递 本地光标返回调用批处理,存储过程或 trigger,可以将参数赋值给游标变量 存储过程终止后引用游标。光标 批处理,存储过程或触发器时隐式解除分配 除非光标在OUTPUT参数中传回,否则终止。 如果在OUTPUT参数中传回,则会释放游标 当引用它的最后一个变量被解除分配或退出时 范围。
答案 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