游标存储的是数据集,我们可以将select * from table所查询到的数据放到游标里面
首先创建一个游标
DECLARE cursor_Change CURSOR scroll --创建动态游标
DECLARE译为声明,cursor_Change游标名称,CURSOR scroll译为滚动的游标
紧跟着为游标赋值
FOR SELECT Name, Sex FROM tableA;--创建游标接受结果集
可以提前定义好变量,存储从游标单个拿出来的数据,可以方便我们更精确的对每条数据进行判断和处理
declare @Name varchar(50) ,@Sex varchar(4)
打开游标
OPEN cursor_Change --打开游标
获取游标中的第一条数据,并将其赋值给上面定义好的@Name ,@Sex
fetch First from cursor_Change into @Name ,@Sex--into的变量数量必须与游标查询结果集的列数相同
@Name ,@Sex
fetch next from cursor_Change into @Name ,@Sex--移动游标到下一条
值得注意的是获取第一条的时候用的是first关键词,下一条是next关键词
下面是我在实际开发过程中,使用游标的详细例子(我将游标放在了存储过程里面)
CREATE PROCEDURE [dbo].[ZHHJ_KY_ProjectPre_ListB_Update]
@AId varchar(50),
@BId varchar(50)
AS
/*****************************************************
作者:WZ
初次编写日期:2022/12/8
最后修改日期: 2022/12/8
功能说明:批准或生效后修改原数据
******************************************************
游标存储的是查询的结果,可以想象成一条select语句查询的结果全部放到一个变量里
******************************************************/
declare @OldId uniqueidentifier ,@BudgetAmountAfter DECIMAL(18,6),@CompanyAmountAfter DECIMAL(18,6),@OtherAmountAfter DECIMAL(18,6)
BEGIN
SET NOCOUNT ON;--将不向客户端发送存储过程每个语句的DONE_IN_proc消息,如果存储过程中包含一些并不返回实际数据的语句,网络通信流量便会大量减少,可以显著提高应用程序性能;
DECLARE cursor_Change CURSOR scroll --创建动态游标
FOR SELECT OldId, BudgetAmountAfter, CompanyAmountAfter, OtherAmountAfter FROM ZHHJ_KY_ProjectPreChange_ListB where MainId=@AId;--创建游标接受结果集
OPEN cursor_Change --打开游标
fetch First from cursor_Change into @OldId ,@BudgetAmountAfter,@CompanyAmountAfter,@OtherAmountAfter--into的变量数量必须与游标查询结果集的列数相同
--0,Fetch语句成功。
--1:Fetch语句失败或行不在结果集中。
--2:提取的行不存在。
WHILE @@FETCH_STATUS=0 --判断FETCH语句是否执行成功
BEGIN
if exists(select * from ZHHJ_KY_ProjectPre_ListB where MainId=@BId)--存在则更新
begin
--有Id相同的数据,进行更新处理,且只更新传进来的项目Id对应的数据
update ZHHJ_KY_ProjectPre_ListB set BudgetAmount=@BudgetAmountAfter,CompanyAmount=@CompanyAmountAfter,OtherAmount=@OtherAmountAfter where Id=@OldId and MainId=@BId
end
else--不存在,RETURN掉
begin
RETURN
end
fetch next from cursor_Change into @OldId ,@BudgetAmountAfter,@CompanyAmountAfter,@OtherAmountAfter --移动游标,
END
CLOSE cursor_Change--关闭游标
DEALLOCATE cursor_Change;--释放游标
END
GO