SQL服务器游标的默认类型(Default type of SQL Server Cursor)

2019-10-21 11:19发布

只要有关于SQL服务器游标一个非常简单的问题。 如果你声明与所有默认选项光标,它默认为FORWARD_ONLY DYNAMIC光标? 下面是从MSFT文档片段:

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

所以,把这些2“加粗”语句组合在一起,是我的假设是正确的?

谢谢

Answer 1:

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

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

在我的系统这会产生TSQL | Snapshot | Read Only | Global (0) TSQL | Snapshot | Read Only | Global (0) 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) TSQL | Dynamic | Optimistic | Global (0) TSQL | Dynamic | Optimistic | Global (0)换句话说,一个GLOBAL DYNAMIC OPTIMISTIC光标。

这个故事的寓意是很可能,你不应该依赖于默认值; 有没有很好的理由,除非出于某种原因,你必须坚持ANSI语法,不指定任何选项。 如果是这样的话,你看这是一个使用游标的数据库无关的代码,这是一个真正可怕的前景确实如此。



文章来源: Default type of SQL Server Cursor