SqlServer 游标选项说明及测试
USE [Temp] GO -- 创建测试表 CREATE TABLE [dbo].[CURTAB]( [Guid] [uniqueidentifier] NOT NULL,[Name] [varchar](50) NULL,[Value] [numeric](18,4) NULL,[InsertDate] [datetime] NOT NULL,[Mark] [bit] NULL,CONSTRAINT [PK_CURTAB] PRIMARY KEY CLUSTERED ([Guid] ASC) ) ON [PRIMARY] GO ALTER TABLE [dbo].[CURTAB] ADD CONSTRAINT [DF_CURTAB_Guid] DEFAULT (newsequentialid()) FOR [Guid] GO ALTER TABLE [dbo].[CURTAB] ADD CONSTRAINT [DF_CURTAB_InsertDate] DEFAULT (getdate()) FOR [InsertDate] GO ALTER TABLE [dbo].[CURTAB] ADD CONSTRAINT [DF_CURTAB_Mark] DEFAULT (0) FOR [Mark] GO --插入30万行记录 SET NOCOUNT ON INSERT INTO [dbo].[CURTAB](Name,value) SELECT 'KK',0 GO 300000 SET NOCOUNT OFF --全表查询4秒 SELECT [Guid],[Name],[Value],[InsertDate],[Mark] FROM [dbo].[CURTAB] /* 游标使用步骤: DECLARE CURSOR 定义 Transact-SQL 服务器游标的属性,例如游标的滚动行为和用于生成游标所操作的结果集的查询。 OPEN 语句填充结果集, FETCH 从结果集返回行。 CLOSE 语句释放与游标关联的当前结果集。 DEALLOCATE 语句释放游标所使用的资源。 声明游标语法: DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ] FOR select_statement [ FOR UPDATE [ OF column_name [,...n ] ] ] */ --测试 SET NOCOUNT ON DECLARE @GUID UNIQUEIDENTIFIER DECLARE @NAME VARCHAR(50) DECLARE @VALUE DECIMAL(18,4) DECLARE @InsertDate DATETIME DECLARE @Mark bit DECLARE MYCUR CURSOR TYPE_WARNING FOR SELECT [Guid],[Mark] FROM [dbo].[CURTAB] -- FOR UPDATE OF [Value] OPEN MYCUR --FETCH FIRST FROM MYCUR INTO @GUID,@NAME,@VALUE,@InsertDate,@Mark FETCH NEXT FROM MYCUR INTO @GUID,@Mark --WAITFOR DELAY '01:00:00' --用于测试 SCROLL_LOCKS 和 OPTIMISTIC WHILE @@FETCH_STATUS = 0 BEGIN --UPDATE [dbo].[CURTAB] SET [Value]=0 WHERE CURRENT OF MYCUR FETCH NEXT FROM MYCUR INTO @GUID,@Mark END CLOSE MYCUR DEALLOCATE MYCUR SET NOCOUNT OFF 官方说明和测试总结: > 如果 SELECT 语句不支持更新(由于权限不够、访问的远程表不支持更新等等),则游标为 READ_ONLY。 参考: DECLARE CURSOR (Transact-SQL) 用隐式游标转换 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |