说到游标,其实在实际开发中并不常用,他的特点就是行处理,当我们也好对每一行数据进行数据处理的时候,会用到游标,还有遇到一些对单行复杂的逻辑操作,或者用到临时表时用游标最好。
游标的定义方式分五步:1,声明游标 2,打开游标 3,处理数据 4,关闭游标 5, 释放游标(删除游标)
首先建一张表
create table Student(
[Id] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](50) NULL,
[age] [varchar][50] NULL
)
声明游标:
declare StudentCur cursor --声明时未指定"local"或"global"关键字,系统默认游标是"global(全局)"的.
for
select name,age from Student
GO
打开游标:
Open StudentCur
while @@status=0
处理数据:
fetch next from StudentCur
begin
fetch next from studentCur --读取当前行的下一行,并使其置为当前行(刚开始时游标置于表头的前一行,即若表是从0开始的,游标最初置于-1处,所以第一次读取的是头一行)
fetch prior from studentCur --读取当前行的前一行,并使其置为当前行
fetch first from studentCur --读取游标的第一行,并使其置为当前行(不能用于只进游标)
fetch last from studentCur --读取游标的最后一行,并使其置为当前行(不能用于只进游标)
fetch absolute 2 from studentCur --读取从游标头开始向后的第2行,并将读取的行作为新的行
fetch relative 3 from studentCur --读取从当前行开始向后的第3行,并将读取的行作为新的行
fetch relative-2 from studentCur --读取当前行的上两行,并将读取的行作为新的行
--读取数据结束
end
关闭游标:
close StudentCur
释放游标:
deallocate StudentCur
游标实例:
先向为了有演示游标用法,向Student表中添加学生信息。
insert into Student(name,age)values(‘张三‘,20)
insert into Student(name,age)values(‘李四‘,21)
实现功能:将表中成员的年龄有减1岁
USE [JiZhan] GO /****** Object: StoredProcedure [dbo].[GetSysDateTime] Script Date: 2019/11/20 星期三 13:39:42 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Author,,Name> -- Create date: <Create Date,,> -- Description: <Description,,> -- ============================================= create PROCEDURE [dbo].[Demo] AS declare @Reage int declare @Id int declare StudentCur cursor for select Id, age from Student GO Open StudentCur while @@status=0 fetch next from StudentCur into @Id,@age update Student set age=@age+1 where Id=@id begin fetch next from studentCur into @age,@age --读取当前行的下一行,并使其置为当前行(刚开始时游标置于表头的前一行,即若表是从0开始的,游标最初置于-1处,所以第一次读取的是头一行) update Student set age=@age+1 where Id=@id end close StudentCur deallocate StudentCur
以上我只是做一个简单的实例,其实游标好好多属性,设置应用与不同场景。这就要具体情况具体对待了。
但是我个人建议,能不用游标就不要用游标,太好资源和内存了。
原文:https://www.cnblogs.com/zpy1993-09/p/11898531.html