如何检查光标是否打开?因为很多次我遇到错误'游标已经存在'。请告诉我如何检查光标是否已处于打开状态。
事实上我已经关闭了,并且在最后解除了它(CLOSE ppm_cursor; DEALLOCATE ppm_cursor;)但是我仍然得到同样的错误,原因可能就是这样。
答案 0 :(得分:78)
您可以使用CURSOR_STATUS功能确定其状态。
IF CURSOR_STATUS('global','myCursor')>=-1
BEGIN
DEALLOCATE myCursor
END
答案 1 :(得分:30)
关闭光标,如果它是空的,则取消分配它:
IF (SELECT CURSOR_STATUS('global','myCursor')) >= -1
BEGIN
IF (SELECT CURSOR_STATUS('global','myCursor')) > -1
BEGIN
CLOSE myCursor
END
DEALLOCATE myCursor
END
答案 2 :(得分:4)
只是改变了Gary W提到的内容,加上'SELECT':
IF (SELECT CURSOR_STATUS('global','myCursor')) >= -1
BEGIN
DEALLOCATE myCursor
END
http://social.msdn.microsoft.com/Forums/en/sqlgetstarted/thread/eb268010-75fd-4c04-9fe8-0bc33ccf9357
答案 3 :(得分:0)
我很少使用游标,但我刚发现另外一个可以在这里咬你的项目,游标名称的范围。
如果数据库CURSOR_DEFAULT是全局的,如果在具有特定名称(例如“cur”)的存储过程中声明游标,则会出现“游标已存在”错误,并且当该游标打开时,您将调用另一个存储的声明并打开具有相同名称的光标的过程(例如“cur”)。当嵌套存储过程尝试打开“cur”时,将发生错误。
运行此位sql以查看CURSOR_DEFAULT:
select is_local_cursor_default from sys.databases where name = '[your database name]'
如果此值为“0”,则命名嵌套游标的方式很重要!
答案 4 :(得分:0)
当SSMS中运行的存储过程在循环期间遇到错误,同时光标用于迭代记录并在其关闭之前,这发生在我身上。为了解决这个问题,我在CATCH块中添加了额外的代码,以便在光标仍处于打开状态时关闭光标(使用CURSOR_STATUS作为其他答案)。