认识静态与动态游标

背景:<o:p></o:p>

静态(STATIC)游标创建将由该游标使用的数据的临时复本。对游标的所有请求都从tempdb 中的这一临时表中得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改<o:p></o:p>

动态(DYNAMIC) 游标会反映在滚动游标时对结果集内的各行所做的所有数据更改。行的数据值、顺序和成员身份在每次提取时都会更改。动态游标不支持ABSOLUTE 提取选项。<o:p></o:p>

不指定STATIC 关键字的时候, 默认定义的游标是动态(DYNAMIC) <o:p></o:p>

如果很在意游标的类型, 应该在定义游标的时候, 加上游标类型定义的关键字, 并加上TYPE_WARNING 关键字, 以便在游标类型不是预期的情况下, 收到警告信息<o:p></o:p>

<o:p> </o:p>

演示:<o:p></o:p>

下面的演示针对 STATIC DYNAMIC 游标, 显示两者在游标循环期的差异<o:p></o:p>

-- 定义演示数据<o:p></o:p>

IF OBJECT_ID('tempdb..#tb') IS NOT NULL<o:p></o:p>

    DROP TABLE #tb<o:p></o:p>

CREATE TABLE #tb(<o:p></o:p>

    id int PRIMARY KEY,<o:p></o:p>

    col sysname)<o:p></o:p>

INSERT #tb(<o:p></o:p>

    id, col)<o:p></o:p>

SELECT 1, 'AA' <st1:place w:st="on">UNION</st1:place> ALL<o:p></o:p>

SELECT 2, 'BB' <st1:place w:st="on">UNION</st1:place> ALL<o:p></o:p>

SELECT 3, 'CC' <st1:place w:st="on">UNION</st1:place> ALL<o:p></o:p>

SELECT 4, 'DD'<o:p></o:p>

<o:p> </o:p>

-- 游标测试<o:p></o:p>

DECLARE CUR_tb CURSOR LOCAL FORWARD_ONLY READ_ONLY TYPE_WARNING DYNAMIC--STATIC<o:p></o:p>

FOR           <o:p></o:p>

SELECT <o:p></o:p>

    id, col<o:p></o:p>

FROM #tb<o:p></o:p>

<o:p> </o:p>

-- 游标打开前删除记录<o:p></o:p>

DELETE TOP (1)<o:p></o:p>

FROM #tb<o:p></o:p>

WHERE id = 4<o:p></o:p>

SELECT 'before cursor open', * FROM #tb<o:p></o:p>

<o:p> </o:p>

-- 打开游标<o:p></o:p>

OPEN CUR_tb<o:p></o:p>

<o:p> </o:p>

-- 游标打开后删除记录<o:p></o:p>

DELETE TOP (1)<o:p></o:p>

FROM #tb<o:p></o:p>

WHERE id = 3<o:p></o:p>

SELECT 'after cursor open', * FROM #tb<o:p></o:p>

FETCH CUR_tb<o:p></o:p>

WHILE @@FETCH_STATUS = 0<o:p></o:p>

BEGIN<o:p></o:p>

    -- 游标循环中删除记录<o:p></o:p>

    DELETE TOP (1)<o:p></o:p>

    FROM #tb<o:p></o:p>

    WHERE id = 2<o:p></o:p>

<o:p> </o:p>

    FETCH CUR_tb<o:p></o:p>

END<o:p></o:p>

CLOSE CUR_tb<o:p></o:p>

DEALLOCATE CUR_tb<o:p></o:p>

 

你可能感兴趣的:(游标)