Ответ 1
Вы можете использовать функцию CURSOR_STATUS, чтобы определить ее состояние.
IF CURSOR_STATUS('global','myCursor')>=-1
BEGIN
DEALLOCATE myCursor
END
Как проверить, открыт ли курсор или нет? Потому что много раз я сталкиваюсь с ошибкой "Курсор уже существует". Пожалуйста, дайте мне знать, как я могу проверить, находится ли курсор в открытом состоянии.
Фактически я закрыл, а также освободил его в конце (CLOSE ppm_cursor; DEALLOCATE ppm_cursor;) Но все же я получаю ту же ошибку, что может быть причиной.
Вы можете использовать функцию CURSOR_STATUS, чтобы определить ее состояние.
IF CURSOR_STATUS('global','myCursor')>=-1
BEGIN
DEALLOCATE myCursor
END
Закройте курсор, если он пуст, освободите его:
IF (SELECT CURSOR_STATUS('global','myCursor')) >= -1
BEGIN
IF (SELECT CURSOR_STATUS('global','myCursor')) > -1
BEGIN
CLOSE myCursor
END
DEALLOCATE myCursor
END
Просто небольшое изменение к тому, что упоминал Гэри У., добавив "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
Одно решение, использующее Динамическое управление функция:
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;
Я редко использую курсоры, но я только что обнаружил один другой элемент, который может укусить вас здесь, объем имени курсора.
Если база данных CURSOR_DEFAULT является глобальной, вы получите ошибку "курсор уже существует", если вы объявите курсор в хранимой процедуре с определенным именем (например, "cur" ), и пока этот курсор открыт, вы вызываете другой сохраненный процедура, которая объявляет и открывает курсор с тем же именем (например, "cur" ). Ошибка будет возникать во вложенной хранимой процедуре при попытке открыть "cur" .
Запустите этот бит sql, чтобы увидеть свой CURSOR_DEFAULT:
select is_local_cursor_default from sys.databases where name = '[your database name]'
Если это значение равно "0", то как вы назовете свой вложенный курсор!
Это случилось со мной, когда хранимая процедура, запущенная в SSMS, обнаружила ошибку во время цикла, в то время как курсор использовался для перебора записей и перед закрытием. Чтобы исправить это, я добавил дополнительный код в блок CATCH, чтобы закрыть курсор, если он все еще открыт (используя CURSOR_STATUS, как предлагают другие ответы здесь).