Sql Server系列:游标
1. 游标简介
游标是一种处理数据的方法,主要用于存储过程、触发器和Transact-SQL脚本中。SELECT语句返回的是一个结果集,游标能够从包含多条数据记录的结果集中每次提取一条记录。
游标的特点:
◊ 允许对由SELECT查询语句返回的行集中的每一行执行相同或者不同的操作,而不是对整个集合执行同一个操作。
◊ 提供对基于游标位置的表中的行进行删除和更新。
2. 游标的基本操作
2.1 声明游标
声明游标语法:
ISO Syntax DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR FOR select_statement [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ] [;] Transact-SQL Extended Syntax 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 ] ] ] [;]
2.2 打开游标
在使用游标之前,必须打开游标。
打开游标的语法格式:
OPEN { { [ GLOBAL ] cursor_name } | cursor_variable_name }
2.3 读取游标中的数据
打开游标之后,可以读取游标中的数据。FETCH用来读取游标中的某一行数据。
FETCH语句的语法格式:
FETCH [ [ NEXT | PRIOR | FIRST | LAST | ABSOLUTE { n | @nvar } | RELATIVE { n | @nvar } ] FROM ] { { [ GLOBAL ] cursor_name } | @cursor_variable_name } [ INTO @variable_name [ ,...n ] ]
2.4 关闭游标
在不使用游标的时候,可以将其关闭,以释放游标所占用的服务器资源。
关闭游标CLOSE语法格式:
CLOSE { { [ GLOBAL ] cursor_name } | cursor_variable_name }
2.5 释放游标
游标操作的结果集空间虽然被释放了,但是游标结构本身也会占用一定的资源,所以在使用完游标之后,为了收回被游标占用的资源,应该讲游标释放。
释放游标DEALLOCATE语法格式:
DEALLOCATE { { [ GLOBAL ] cursor_name } | @cursor_variable_name }
3. 游标应用
3.1 使用游标变量
DECLARE @CUR_Product CURSOR -- 声明游标变量 DECLARE CUR_Product CURSOR FOR -- 创建游标 SELECT [ProductID],[ProductName] FROM [dbo].[Product] OPEN CUR_Product -- 打开游标 SET @CUR_Product = CUR_Product -- 为游标变量赋值 FETCH NEXT FROM @CUR_Product -- 从游标变量中读取值 WHILE @@FETCH_STATUS = 0 -- 判断FETCH语句是否获取到记录 BEGIN FETCH NEXT FROM @CUR_Product -- 读取游标变量中的数据 END CLOSE @CUR_Product -- 关闭游标 DEALLOCATE @CUR_Product -- 释放游标
3.2 使用游标为变量赋值
DECLARE @ProductID INT DECLARE CUR_Product CURSOR FAST_FORWARD READ_ONLY FOR SELECT [ProductID] FROM [dbo].[Product] ORDER BY [ProductID] DESC OPEN CUR_Product FETCH NEXT FROM CUR_Product INTO @ProductID WHILE @@FETCH_STATUS = 0 BEGIN PRINT @ProductID FETCH NEXT FROM CUR_Product INTO @ProductID END CLOSE CUR_Product DEALLOCATE CUR_Product
DECLARE @ProductID INT DECLARE @ProductName VARCHAR(50) DECLARE CUR_Product CURSOR FAST_FORWARD READ_ONLY FOR SELECT [ProductID],[ProductName] FROM [dbo].[Product] OPEN CUR_Product FETCH NEXT FROM CUR_Product INTO @ProductID,@ProductName WHILE @@FETCH_STATUS = 0 BEGIN PRINT CONVERT(VARCHAR, @ProductID) + ' ' + @ProductName FETCH NEXT FROM CUR_Product INTO @ProductID,@ProductName END CLOSE CUR_Product DEALLOCATE CUR_Product