SQL Server 游标的默认类型

fed*_*999 1 sql sql-server-2008

只是有一个关于 SQL Server 游标的非常简单的问题。如果您使用所有默认选项声明一个游标,它是否默认为FORWARD_ONLY DYNAMIC游标?以下是 MSFT 文档中的片段:

FORWARD_ONLY
指定游标只能从第一行滚动到最后一行。FETCH NEXT 是唯一受支持的提取选项。如果在没有 STATIC、KEYSET 或 DYNAMIC 关键字的情况下指定 FORWARD_ONLY,则游标作为 DYNAMIC 游标运行。当 FORWARD_ONLY 和 SCROLL 均未指定时,FORWARD_ONLY 为默认值,除非指定关键字 STATIC、KEYSET 或 DYNAMIC。STATIC、KEYSET 和 DYNAMIC 游标默认为 SCROLL。与 ODBC 和 ADO 等数据库 API 不同,STATIC、KEYSET 和 DYNAMIC Transact-SQL 游标支持 FORWARD_ONLY。

因此,将这两个“粗体”陈述放在一起,我的假设是否正确?

谢谢

Jer*_*ert 5

您引用页面实际上描述了默认值是什么,但不是很清楚。如果您允许作弊的答案:

DECLARE c CURSOR FOR SELECT 1;
SELECT properties FROM sys.dm_exec_cursors(@@spid);
Run Code Online (Sandbox Code Playgroud)

在我的系统上,这会产生TSQL | Snapshot | Read Only | Global (0). sys.dm_exec_cursors上的文档解释了如何解码。在这种情况下,它是一个GLOBAL STATIC READ_ONLY游标。

但是,默认值取决于光标的用途。这个:

CREATE TABLE #a (a INT);
DECLARE c CURSOR FOR SELECT * FROM #a;
SELECT properties FROM sys.dm_exec_cursors(@@spid);
Run Code Online (Sandbox Code Playgroud)

Yields TSQL | Dynamic | Optimistic | Global (0),换句话说就是一个GLOBAL DYNAMIC OPTIMISTIC游标。

这个故事的寓意可能是你不应该依赖默认值;没有充分的理由,除非出于某种原因,您必须遵守 ANSI 语法并且不能指定任何选项。如果是这种情况,您正在查看使用游标的与数据库无关的代码,这确实是一个非常可怕的前景。