Подтвердить что ты не робот

Как проверить, существует ли курсор (открыть статус)

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

Фактически я закрыл, а также освободил его в конце (CLOSE ppm_cursor; DEALLOCATE ppm_cursor;) Но все же я получаю ту же ошибку, что может быть причиной.

4b9b3361

Ответ 1

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

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

Ответ 2

Закройте курсор, если он пуст, освободите его:

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

Ответ 4

Одно решение, использующее Динамическое управление функция:

DECLARE crsA CURSOR LOCAL FAST_FORWARD FOR SELECT * FROM dbo.Factura ;
OPEN crsA;
DECLARE crsB CURSOR LOCAL FAST_FORWARD FOR SELECT * FROM dbo.Employee;


DECLARE @CursorName SYSNAME = 'crsA' --or 'crsB'
SELECT  f.is_open, f.*
FROM    sys.dm_exec_cursors(@@SPID) f
WHERE   f.name = @CursorName 

CLOSE crsA; DEALLOCATE crsA;
DEALLOCATE crsB;

Ответ 5

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

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

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

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

Если это значение равно "0", то как вы назовете свой вложенный курсор!

Ответ 6

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