认识静态与动态游标
背景:
静态(STATIC)游标创建将由该游标使用的数据的临时复本。对游标的所有请求都从tempdb 中的这一临时表中得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改
动态(DYNAMIC) 游标会反映在滚动游标时对结果集内的各行所做的所有数据更改。行的数据值、顺序和成员身份在每次提取时都会更改。动态游标不支持ABSOLUTE 提取选项。
不指定STATIC 关键字的时候, 默认定义的游标是动态(DYNAMIC) 的
如果很在意游标的类型, 应该在定义游标的时候, 加上游标类型定义的关键字, 并加上TYPE_WARNING 关键字, 以便在游标类型不是预期的情况下, 收到警告信息
演示:
下面的演示针对 STATIC 和DYNAMIC 游标, 显示两者在游标循环期的差异
-- 定义演示数据
IF OBJECT_ID('tempdb..#tb')IS NOT NULL
DROPTABLE #tb
CREATETABLE #tb(
id intPRIMARY KEY,
col sysname)
INSERT #tb(
id, col)
SELECT 1,'AA' UNION ALL
SELECT 2,'BB' UNION ALL
SELECT 3,'CC' UNION ALL
SELECT 4,'DD'
-- 游标测试
DECLARE CUR_tbCURSOR LOCAL FORWARD_ONLY READ_ONLY TYPE_WARNING DYNAMIC--STATIC
FOR
SELECT
id, col
FROM #tb
-- 游标打开前删除记录
DELETETOP (1)
FROM #tb
WHERE id= 4
SELECT'before cursor open',* FROM #tb
-- 打开游标
OPEN CUR_tb
-- 游标打开后删除记录
DELETETOP (1)
FROM #tb
WHERE id= 3
SELECT'after cursor open',* FROM #tb
FETCH CUR_tb
WHILE @@FETCH_STATUS = 0
BEGIN
-- 游标循环中删除记录
DELETETOP (1)
FROM #tb
WHERE id= 2
FETCH CUR_tb
END
CLOSE CUR_tb
DEALLOCATE CUR_tb

本文介绍了数据库中静态与动态游标的使用特点及其差异。静态游标创建数据的临时副本,不受外部数据更改的影响;而动态游标则能实时反映数据变化。通过具体示例演示了两种游标在循环过程中的不同表现。
416

被折叠的 条评论
为什么被折叠?



