动态游标(数据库引擎)

动态游标与静态游标相对。当滚动游标时,动态游标反映结果集中所做的所有更改。结果集中的行数据值、顺序和成员在每次提取时都会改变。所有用户做的全部 UPDATE、INSERT 和 DELETE 语句均通过游标可见。如果使用 API 函数(如 SQLSetPos)或 Transact-SQL WHERE CURRENT OF 子句通过游标进行更新,它们将立即可见。在游标外部所做的更新直到提交时才可见,除非将游标的事务隔离级别设为未提交读。

ms189099.note(zh-cn,SQL.90).gif注意:
如果选择用来执行动态游标的查询的执行计划正使用堆扫描,并且在获取页锁或表锁的条件下,则删除行将可能导致整个页被释放。在这种情况下,用于定位的动态光标所使用的标记可能变为无效并且从游标的后续提取将可能失败并导致错误 16931。可行的解决方案包括在表上创建聚集索引、使用不同的游标类型或估计是否可以阻止页级锁和表级锁。
ms189099.note(zh-cn,SQL.90).gif注意:
在 SQL Server 2005 中,动态游标工作表更新始终可以进行。也就是说,即使键列作为更新的一部分更改了,当前行仍将被刷新。在 SQL Server 2000 中,当前行被标记为删除(因为它本不应用于键集游标),但是该行并未插入至工作表的末端(因为它用于键集游标)。结果是游标刷新未找到行并报告此行丢失。SQL Server 2005 保持游标工作表同步,并且刷新能够找到行,因为它具有新的键。