Как проверить, существует ли курсор (открытый статус) - PullRequest
33 голосов
/ 15 сентября 2011

Как проверить, открыт курсор или нет?Потому что много раз я сталкиваюсь с ошибкой «Курсор уже существует».Пожалуйста, дайте мне знать, как я могу проверить, находится ли курсор уже в открытом состоянии.

Фактически я закрыл, а также удалил его в конце (ЗАКРЫТЬ ppm_cursor; DEALLOCATE ppm_cursor;) Но все же я получаюта же ошибка, в чем может быть причина.

Ответы [ 5 ]

78 голосов
/ 15 сентября 2011

Вы можете использовать функцию CURSOR_STATUS , чтобы определить ее состояние.

IF CURSOR_STATUS('global','myCursor')>=-1
BEGIN
 DEALLOCATE myCursor
END
31 голосов
/ 15 октября 2014

Закрыть курсор, если он пуст, затем освободить его:

IF (SELECT CURSOR_STATUS('global','myCursor')) >= -1
 BEGIN
  IF (SELECT CURSOR_STATUS('global','myCursor')) > -1
   BEGIN
    CLOSE myCursor
   END
 DEALLOCATE myCursor
END
4 голосов
/ 04 февраля 2013

Просто небольшое изменение к тому, что упомянул Гэри У, добавив «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

0 голосов
/ 11 февраля 2016

Это произошло со мной, когда хранимая процедура, работающая в SSMS, обнаружила ошибку во время цикла, когда курсор использовался для перебора записей и до того, как он был закрыт. Чтобы исправить это, я добавил дополнительный код в блок CATCH, чтобы закрыть курсор, если он все еще открыт (используя CURSOR_STATUS, как предлагают другие ответы).

0 голосов
/ 15 августа 2014

Я редко использую курсоры, но я только что обнаружил еще один предмет, который может укусить вас здесь - область действия имени курсора.

Если база данных CURSOR_DEFAULT является глобальной, вы получите ошибку «курсор уже существует», если вы объявите курсор в хранимой процедуре с определенным именем (например, «cur»), и пока этот курсор открыт, вывызовите другую хранимую процедуру, которая объявляет и открывает курсор с тем же именем (например, «cur»).Ошибка будет возникать во вложенной хранимой процедуре при попытке открыть «cur».

Запустите этот бит sql, чтобы увидеть ваш CURSOR_DEFAULT:

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

Если это значение равно «0»тогда то, как вы называете свой вложенный курсор, имеет значение!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...