SET CURSOR_CLOSE_ON_COMMIT (Transact-SQL)

Steuert das Verhalten der Transact-SQL-Anweisung COMMIT TRANSACTION. Der Standardwert für diese Einstellung ist OFF. Dies bedeutet, dass der Server Cursor nicht schließt, wenn Sie ein Commit für eine Transaktion ausführen.

Themenlink (Symbol) Transact-SQL-Syntaxkonventionen


SET CURSOR_CLOSE_ON_COMMIT { ON | OFF }

Wenn SET CURSOR_CLOSE_ON_COMMIT auf ON festgelegt ist, schließt diese Einstellung alle offenen Cursor bei Ausführung des Commits oder Rollbacks in Übereinstimmung mit ISO. Wenn SET CURSOR_CLOSE_ON_COMMIT auf OFF festgelegt ist, wird der Cursor nicht geschlossen, wenn ein Commit für eine Transaktion ausgeführt wird.

HinweisHinweis

Wenn SET CURSOR_CLOSE_ON_COMMIT auf ON festgelegt ist, werden geöffnete Cursor bei Ausführung des Rollbacks nicht geschlossen, wenn das Rollback von einer SAVE TRANSACTION-Anweisung auf savepoint_name angewendet wird.

Wenn SET CURSOR_CLOSE_ON_COMMIT auf OFF festgelegt ist, schließt eine ROLLBACK-Anweisung nur geöffnete asynchrone Cursor ein, die nicht vollständig aufgefüllt sind. STATIC- oder INSENSITIVE-Cursor, die geöffnet wurden, nachdem Änderungen vorgenommen wurden, spiegeln den Datenstatus nicht mehr wider, wenn für die Änderungen ein Rollback ausgeführt wird.

SET CURSOR_CLOSE_ON_COMMIT steuert das gleiche Verhalten wie die Datenbankoption CURSOR_CLOSE_ON_COMMIT. Wenn CURSOR_CLOSE_ON_COMMIT auf ON oder OFF festgelegt ist, wird diese Einstellung für die Verbindung verwendet. Wenn SET CURSOR_CLOSE_ON_COMMIT nicht angegeben wurde, wird der Wert in der Spalte is_cursor_close_on_commit_on der Katalogsicht sys.databases angewendet.

Der SQL Server Native Client-OLE DB-Anbieter für SQL Server und der SQL Server Native Client-ODBC-Treiber legen beim Herstellen einer Verbindung CURSOR_CLOSE_ON_COMMIT auf OFF fest. Die DB-Library legt den Wert von CURSOR_CLOSE_ON_COMMIT nicht automatisch fest.

Ist SET ANSI_DEFAULTS auf ON festgelegt, so ist SET CURSOR_CLOSE_ON_COMMIT aktiviert.

Die Einstellung von SET CURSOR_CLOSE_ON_COMMIT wird zur Ausführungszeit und nicht zur Analysezeit festgelegt.

Erfordert die Mitgliedschaft in der Rolle public.

Im folgenden Beispiel wird ein Cursor in einer Transaktion definiert. Anschließend wird versucht, den Cursor zu verwenden, nachdem ein Commit für die Transaktion ausgeführt wurde.

-- 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

Community-Beiträge

HINZUFÜGEN
Anzeigen: