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,则在提交事务时将不关闭游标。

注意注意

如果 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 的设置是在执行或运行时设置的,而不是在分析时设置的。

权限

要求用户为 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