关于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"加粗"一起陈述,我的假设是正确的吗?
由于
答案 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语法并且不能指定任何选项,否则没有充分的理由。如果是这种情况,那么您正在查看使用游标的数据库无关代码,这确实是一个非常可怕的前景。