it-swarm.cn

如何检查光标是否存在(打开状态)

如何检查游标是否打开?因为很多时候我遇到错误“光标已存在”。请让我知道如何检查游标是否已处于打开状态。

实际上,我已经关闭并在末尾释放了它(CLOSE ppm_cursor; DEALLOCATE ppm_cursor;)。但是我仍然收到相同的错误,这可能是原因。

35
Maddy

您可以使用 CURSOR_STATUS 函数来确定其状态。

IF CURSOR_STATUS('global','myCursor')>=-1
BEGIN
 DEALLOCATE myCursor
END
80
Gary W

关闭游标,如果它为空,则取消分配它:

IF (SELECT CURSOR_STATUS('global','myCursor')) >= -1
 BEGIN
  IF (SELECT CURSOR_STATUS('global','myCursor')) > -1
   BEGIN
    CLOSE myCursor
   END
 DEALLOCATE myCursor
END
34
Prateek

对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

4

当在SSMS中运行的存储过程在循环过程中遇到错误时,这是​​发生在我身上的,而在使用游标遍历记录时以及在关闭游标之前,游标都已发生。为了解决这个问题,我在CATCH块中添加了额外的代码,以在游标仍处于打开状态时将其关闭(使用CURSOR_STATUS作为此处建议的其他答案)。

0
Aaron

我很少使用游标,但是我发现了另一个可以在这里咬到您的项目,即游标名称的范围。

如果数据库CURSOR_DEFAULT是全局数据库,则如果在具有特定名称(例如“ cur”)的存储过程中声明游标,则将得到“游标已存在”错误,并且在打开该游标时调用另一个声明并打开一个具有相同名称的光标(例如“ cur”)。尝试打开“ cur”时,该错误将在嵌套存储过程中发生。

运行以下这行sql来查看您的CURSOR_DEFAULT:

select is_local_cursor_default from sys.databases where name = '[your database name]'

如果该值为“ 0”,那么如何命名嵌套游标就很重要!

0
Tom Regan