游标存储的是数据集,我们可以将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