SET CURSOR_CLOSE_ON_COMMIT (Transact-SQL)

Controla o comportamento da instrução Transact-SQL COMMIT TRANSACTION. O valor padrão dessa configuração é OFF. Isso significa que o servidor não fechará os cursores quando você confirmar uma transação.

Ícone de vínculo de tópicoConvenções de sintaxe da Transact-SQL

Sintaxe

SET CURSOR_CLOSE_ON_COMMIT { ON | OFF }

Comentários

Quando SET CURSOR_CLOSE_ON_COMMIT for ON, esta configuração fecha qualquer cursor aberto em confirmação ou reversão em conformidade com a ISO. Quando SET CURSOR_CLOSE_ON_COMMIT for OFF, o cursor não será fechado quando uma transação estiver confirmada.

ObservaçãoObservação

SET CURSOR_CLOSE_ON_COMMIT como ON não fechará cursores abertos em reversão quando a reversão for aplicada a um savepoint_name de uma instrução SAVE TRANSACTION.

Quando SET CURSOR_CLOSE_ON_COMMIT for OFF, uma instrução ROLLBACK fechará apenas cursores assíncronos abertos que não estejam totalmente populados. Cursores STATIC ou INSENSITIVE abertos depois que modificações foram feitas não refletirão o estado dos dados se as modificações forem revertidas.

SET CURSOR_CLOSE_ON_COMMIT controla o mesmo comportamento que a opção de banco de dados a CURSOR_CLOSE_ON_COMMIT. Se CURSOR_CLOSE_ON_COMMIT for definido como ON ou OFF, essa configuração será usada na conexão. Se SET CURSOR_CLOSE_ON_COMMIT não for especificado, o valor na coluna is_cursor_close_on_commit_on na exibição do catálogo sys.databases será aplicado.

O SQL ServerProvedor OLE DB Native Client para SQL Server e o SQL ServerDriver ODBC Native Client definem CURSOR_CLOSE_ON_COMMIT como OFF quando se conectam. A biblioteca de banco de dados não define o valor de CURSOR_CLOSE_ON_COMMIT automaticamente.

Quando SET ANSI_DEFAULTS for ON, SET CURSOR_CLOSE_ON_COMMIT é habilitado.

A configuração de SET CURSOR_CLOSE_ON_COMMIT é definida no momento da execução e não no momento da análise.

Permissões

Requer associação na função public.

Exemplos

O exemplo a seguir define um cursor em uma transação e tentativas de usá-lo depois que a transação for confirmada.

-- SET CURSOR_CLOSE_ON_COMMIT
-------------------------------------------------------------------------------
SET NOCOUNT ON

CREATE TABLE t1 (
   a INT
)
GO 

INSERT INTO t1 
VALUES (1)
INSERT INTO t1 
VALUES (2)
GO

PRINT '-- SET CURSOR_CLOSE_ON_COMMIT ON'
GO
SET CURSOR_CLOSE_ON_COMMIT ON
GO
PRINT '-- BEGIN TRAN'
BEGIN TRAN
PRINT '-- Declare and open cursor'
DECLARE testcursor CURSOR FOR
SELECT a 
FROM t1
OPEN testcursor
PRINT '-- Commit tran'
COMMIT TRAN
PRINT '-- Try to use cursor'
FETCH NEXT FROM testcursor
CLOSE testcursor
DEALLOCATE testcursor
GO
PRINT '-- SET CURSOR_CLOSE_ON_COMMIT OFF'
GO
SET CURSOR_CLOSE_ON_COMMIT OFF
GO
PRINT '-- BEGIN TRAN'
BEGIN TRAN
PRINT '-- Declare and open cursor'
DECLARE testcursor CURSOR FOR
SELECT a 
FROM t1
OPEN testcursor
PRINT '-- Commit tran'
COMMIT TRAN
PRINT '-- Try to use cursor'
FETCH NEXT FROM testcursor
CLOSE testcursor
DEALLOCATE testcursor
GO
DROP TABLE t1;
GO