SET CURSOR_CLOSE_ON_COMMIT (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

控制 Transact-SQL COMMIT TRANSACTION 语句的行为。 此设置的默认值为 OFF。 这表示提交事务时服务器将不会关闭游标。

Transact-SQL 语法约定

语法

  
SET CURSOR_CLOSE_ON_COMMIT { ON | OFF }  

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

备注

如果 SET CURSOR_CLOSE_ON_COMMIT 为 ON,此设置将遵从 ISO 标准,在提交或回滚时关闭所有打开的游标。 如果 SET CURSOR_CLOSE_ON_COMMIT 为 OFF,则在提交事务时将不关闭游标。

注意

如果 SET CURSOR_CLOSE_ON_COMMIT 为 ON,则从 SAVE TRANSACTION 语句将回滚应用于 savepoint_name 时,将不关闭为回滚打开的游标。

如果 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 的 SQL Server Native Client OLE DB 提供程序和 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;  

权限

要求 公共 角色具有成员身份。

示例

以下示例将在事务中定义一个游标,并尝试在提交事务后使用该游标。

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