SET CURSOR_CLOSE_ON_COMMIT (Transact-SQL)

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

适用范围:SQL Server(SQL Server 2008 至当前版本),Windows Azure SQL Database(初始版本至当前版本)。

主题链接图标 Transact-SQL 语法约定

语法

SET CURSOR_CLOSE_ON_COMMIT { ON | OFF }

注释

如果 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 Native Client ODBC 驱动程序以及 SQL Server Native Client OLE DB Provider for SQL Server 在连接时都会将 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)