SET CURSOR_CLOSE_ON_COMMIT (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

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.

Transact-SQL-Syntaxkonventionen

Syntax

  
SET CURSOR_CLOSE_ON_COMMIT { ON | OFF }  

Hinweis

Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 (12.x) und früher finden Sie unter Dokumentation zu früheren Versionen.

Hinweise

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.

Hinweis

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.

Um die aktuelle Einstellung anzuzeigen, führen Sie die folgende Abfrage aus.

DECLARE @CURSOR_CLOSE VARCHAR(3) = 'OFF';  
IF ( (4 & @@OPTIONS) = 4 ) SET @CURSOR_CLOSE = 'ON';  
SELECT @CURSOR_CLOSE AS CURSOR_CLOSE_ON_COMMIT;  

Berechtigungen

Erfordert die Mitgliedschaft in der public -Rolle.

Beispiele

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), (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  

Weitere Informationen

ALTER DATABASE (Transact-SQL)
BEGIN TRANSACTION (Transact-SQL)
CLOSE (Transact-SQL)
COMMIT TRANSACTION (Transact-SQL)
ROLLBACK TRANSACTION (Transact-SQL)
SET-Anweisungen (Transact-SQL)
SET ANSI_DEFAULTS (Transact-SQL)