游标(Cursor):设置一个数据表的行指针,然后使用循环等操作数据。
游标包含两个部分:一个是游标结果集、一个是游标位置。
游标结果集:定义该游标得SELECT语句返回的行的集合。游标位置:指向这个结果集某一行的当前指针。
声明游标: Declare 游标名称 Cursor for select * from 表名
使用游标:使用Fetch语句从Transaction-SQL服务器游标中检索特定的一行。使用Fetch操作,可以使游标移动到下一个记录,并将游标返回的每个列得数据分别赋值给声明的本地变量。
Fetch [Next | Prior | First | Last | Absolute n | Relative n ] From 游标名称 Into @变量1,@变量2
Next表示返回结果集中当前行的下一行记录,如果第一次读取则返回第一行。默认的读取选项为Next
Prior表示返回结果集中当前行的前一行记录,如果第一次读取则没有行返回,并且把游标置于第一行之前。
First表示返回结果集中的第一行,并且将其作为当前行。
Last表示返回结果集中的最后一行,并且将其作为当前行。
关闭游标: Close 游标名称释放游标: Deallocate 游标名称
具体可参考这篇博文,写的很详细:http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html
实例:
--创建游标来获取当天更新的数据
DECLARE cur_update cursor for
select * from his_gxjg0101 where convert(nvarchar(50),UPDATEDTIME,112) = CONVERT(nvarchar(50),getdate(),112)
declare @begintime date
declare @endtime date
declare @gh nvarchar(32)
declare @classtype nvarchar(50)
declare @updatedtime datetime
SET NOCOUNT ON; --当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。
--往历史拉链表中插入最新数据
insert into his_gxjg0101
select updatedtime, convert(date,'99991231',120),gh,classtype,getdate() from gxjg0101
where convert(nvarchar(50),UPDATEDTIME,112) = CONVERT(nvarchar(50),getdate(),112)
--打开游标,更新历史数据的结束时间
open cur_update
fetch nextfrom cur_update into@begintime,@endtime,@gh,@classtype,@updatedtime
while (@@FETCH_STATUS=0)
begin
update his_gxjg0101 set endtime =@begintime
where endtime = '9999-12-31'
and CONVERT(nvarchar(100),updatedtime,111) != CONVERT(nvarchar(100),getdate(),111)
and gh = @gh
fetch nextfrom cur_update into@begintime,@endtime,@gh,@classtype,@updatedtime
end
close cur_update