SET CURSOR_CLOSE_ON_COMMIT (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

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

Transact-SQL 構文表記規則

構文

  
SET CURSOR_CLOSE_ON_COMMIT { ON | OFF }  

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

解説

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

Note

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 と the 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 は有効になります。

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

この設定の現在の設定を表示するには、次のクエリを実行します。

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

アクセス許可

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

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

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

参照

ALTER DATABASE (Transact-SQL)
BEGIN TRANSACTION (Transact-SQL)
CLOSE (Transact-SQL)
COMMIT TRANSACTION (Transact-SQL)
ROLLBACK TRANSACTION (Transact-SQL)
SET ステートメント (Transact-SQL)
SET ANSI_DEFAULTS (Transact-SQL)