静态游标和动态游标

静态游标在打开时会将数据集存储在tempdb中,因此显示的数据与游标打开时的数据集保持一致,在游标打开以后对数据库的更新不会显示在游标中。

 

动态游标在打开后会反映对数据库的更改。所有UPDATE、INSERT 和 DELETE 操作都会显示在游标的结果集中,结果集中的行数据值、顺序和成员在每次提取时都会改变。

 

在定义游标的时候如果不指定STATIC关键字,默认是DYNAMIC的。

 

动态游标的打开速度比静态游标的打开速度快。当打开静态游标时,必须生成内部临时工作表,而动态游标则不需要。

 

在联接中,静态游标的速度可能比动态游标的速度快。因为动态游标在滚动时反应对结果集内的各行数据所做的更改,它会消耗资源去检测基表的更改,因此对于复杂的查询,且不需要反映基表的更新的游标的处理应将其定义为静态游标。

 

如果要进行绝对提取,必须使用由键集驱动的游标或静态游标。

 

在使用动态游标时,应该注意行数据的更新所导致的死循环等问题,如下表所示:

SET ANSI_NULLS ON

GO

 

SET QUOTED_IDENTIFIER ON

GO

 

CREATE TABLE [dbo].[Test](

      [ID] [int] NOT NULL,

 CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED ([ID] ASC)) ON [PRIMARY]

 

GO

 

 

INSERT INTO Test VALUES(1)

GO

 

DECLARE C$Cursor Cursor

FOR

SELECT ID From Test Where ID < 10

 

DECLARE @id INT

 

OPEN C$Cursor

Fetch  C$Cursor INTO @id

 

WHILE @@FETCH_STATUS = 0

BEGIN

      UPDATE Test SET ID = ID + 1 WHERE id = @id

      Fetch  C$Cursor INTO @id

END

 

CLOSE C$Cursor

DEALLOCATE C$Cursor

 

 

执行完后表中的数值变成了10,代表更新行执行了多次。如果把游标的定义改成如下:

DECLARE C$Cursor Cursor STATIC

FOR

SELECT ID From Test Where ID < 10

则执行结果为2

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值