SET CURSOR_CLOSE_ON_COMMIT (Transact-SQL)
适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例
控制 Transact-SQL COMMIT TRANSACTION 语句的行为。 此设置的默认值为 OFF。 这表示提交事务时服务器将不会关闭游标。
语法
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 的 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)