SQL Server游标的默认类型

时间:2014-12-19 14:00:59

标签: sql sql-server-2008

关于SQL Server游标,我们有一个非常快速的问题。如果声明一个包含所有默认选项的游标,它是否默认为FORWARD_ONLY DYNAMIC游标?以下是MSFT文档的片段:

  

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

所以把这些2"加粗"一起陈述,我的假设是正确的吗?

由于

1 个答案:

答案 0 :(得分:4)

page you quoted实际上描述了默认值,但不是很清楚。如果您允许答案作弊:

DECLARE c CURSOR FOR SELECT 1;
SELECT properties FROM sys.dm_exec_cursors(@@spid);

在我的系统上,这会产生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);

产生TSQL | Dynamic | Optimistic | Global (0),换言之,GLOBAL DYNAMIC OPTIMISTIC光标。

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