SET CURSOR_CLOSE_ON_COMMIT (Transact-SQL)
Управляет поведением инструкции Transact-SQL COMMIT TRANSACTION. Значение этого параметра по умолчанию равно OFF. Это означает, что сервер не закроет курсоры при подтверждении транзакции.
Синтаксис
SET CURSOR_CLOSE_ON_COMMIT { ON | OFF }
Замечания
Если параметр SET CURSOR_CLOSE_ON_COMMIT имеет значение ON, все открытые курсоры закрываются при фиксации или откате в соответствии со стандартом ISO. Если параметр SET CURSOR_CLOSE_ON_COMMIT имеет значение OFF, при фиксации транзакции курсор не закрывается.
Примечание |
---|
Установка SET CURSOR_CLOSE_ON_COMMIT в ON не закроет открытые курсоры при откате, если откат применяется к savepoint_name из инструкции SAVE TRANSACTION. |
Если SET CURSOR_CLOSE_ON_COMMIT имеет значение OFF, то инструкция ROLLBACK закрывает только открытые асинхронные курсоры, которые не были до конца заполнены. Курсоры STATIC или INSENSITIVE, открытые после того, как были произведены изменения, более не отражают текущее состояние данных, если совершен откат изменений.
SET CURSOR_CLOSE_ON_COMMIT управляет тем же самым поведением, что и параметр базы данных CURSOR_CLOSE_ON_COMMIT. Если CURSOR_CLOSE_ON_COMMIT установлен в ON или OFF, то эта установка используется при соединении. Если SET CURSOR_CLOSE_ON_COMMIT не был определен, то применяется значение столбца is_cursor_close_on_commit_on в представлении каталога sys.databases.
Как поставщик SQL Server OLE DB для собственного клиента SQL Server, так и драйвер ODBC собственного клиента SQL Server устанавливают параметр CURSOR_CLOSE_ON_COMMIT при соединении в значение OFF. Библиотека DB-Library автоматически не устанавливает значения CURSOR_CLOSE_ON_COMMIT.
Если SET ANSI_DEFAULTS устанавливается в ON, то это включает SET CURSOR_CLOSE_ON_COMMIT.
Установка значения SET CURSOR_CLOSE_ON_COMMIT производится во время исполнения или запуска, но не во время синтаксического анализа.
Разрешения
Необходимо членство в роли public.
Примеры
Следующий пример определяет курсор в транзакции и пытается использовать его после того, как транзакция зафиксирована.
-- SET CURSOR_CLOSE_ON_COMMIT-------------------------------------------------------------------------------SET NOCOUNT ONCREATE TABLE t1 ( a INT)GO INSERT INTO t1 VALUES (1)INSERT INTO t1 VALUES (2)GOPRINT '-- SET CURSOR_CLOSE_ON_COMMIT ON'GOSET CURSOR_CLOSE_ON_COMMIT ONGOPRINT '-- BEGIN TRAN'BEGIN TRANPRINT '-- Declare and open cursor'DECLARE testcursor CURSOR FORSELECT a FROM t1OPEN testcursorPRINT '-- Commit tran'COMMIT TRANPRINT '-- Try to use cursor'FETCH NEXT FROM testcursorCLOSE testcursorDEALLOCATE testcursorGOPRINT '-- SET CURSOR_CLOSE_ON_COMMIT OFF'GOSET CURSOR_CLOSE_ON_COMMIT OFFGOPRINT '-- BEGIN TRAN'BEGIN TRANPRINT '-- Declare and open cursor'DECLARE testcursor CURSOR FORSELECT a FROM t1OPEN testcursorPRINT '-- Commit tran'COMMIT TRANPRINT '-- Try to use cursor'FETCH NEXT FROM testcursorCLOSE testcursorDEALLOCATE testcursorGODROP TABLE t1;GO