SET CURSOR_CLOSE_ON_COMMIT (Transact-SQL)

Transact-SQL COMMIT TRANSACTION ステートメントの動作を制御します。この設定の既定値は OFF です。つまり、トランザクションのコミット時、サーバーでカーソルはクローズされません。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

SET CURSOR_CLOSE_ON_COMMIT { ON | OFF }

説明

SET CURSOR_CLOSE_ON_COMMIT が ON の場合、この設定では ISO に従い、コミット時またはロールバック時にオープン カーソルがすべてクローズされます。SET CURSOR_CLOSE_ON_COMMIT が OFF の場合、トランザクションのコミット時にカーソルはクローズされません。

注意

SAVE TRANSACTION ステートメントの savepoint_name にロールバックを適用した場合、SET CURSOR_CLOSE_ON_COMMIT を ON にすると、ロールバック時にオープンされているカーソルはクローズされます。

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 が指定されていない場合は、sys.databases カタログ ビューにある is_cursor_close_on_commit_on 列の値が適用されます。

SQL Server Native Client OLE DB Provider for SQL Server と SQL Server Native Client ODBC ドライバはどちらも、接続時に CURSOR_CLOSE_ON_COMMIT を OFF に設定します。DB-Library は CURSOR_CLOSE_ON_COMMIT の値を自動的に設定しません。

SET ANSI_DEFAULTS が ON の場合には、SET CURSOR_CLOSE_ON_COMMIT は有効 (ON) になります。

SET CURSOR_CLOSE_ON_COMMIT は、解析時ではなく実行時に設定されます。

権限

public ロールのメンバシップが必要です。

次の例では、トランザクションの内部でカーソルを定義し、トランザクションがコミットされた後でそのカーソルの使用を試みます。

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