【数据库】Sql Server 使用游标循环记录更新字段值

571 阅读2分钟

我正在参加「掘金·启航计划」

在本篇文章中,我们讲一起了解下Sql Server中,使用游标循环记录更新字段值
游标在sql server数据库中比较常见,也是比较常用的一个知识点

【开发环境】

开发系统:Windows 10 开发语言:SQL Server 开发工具:SQL Server 2008 R2 文章作用:记录、备忘、总结、分享、理解

  • 主要知识点列表 | 编号 | 语言或插件 | 知识点 | 说明 | | --- | --- | --- | --- | | 1 | sql server | 存储过程 | 存储过程的创建 | | 2 | sql server | exec | 执行存储过程的关键词 | | 3 | sql server | declare set | 变量的定义与赋值 | | 4 | sql server | cursor | 游标的定义和使用 | | 5 | sql server | if/else | 逻辑判断语句 | | 6 | sql server | while | 循环语句 | | 7 | sql server | begin end | 语句块,等同于{}花括号 |

【场景】

1、假设一张表的字段guid有些有值,有些没有值,需要通过sql语句批量处理guid为null的记录,并且赋值newid

备注:当然也可以在后台程序进行逻辑更新,这里主要是使用sql语句进行更新,相当于一个DBA的简单工作

2、创建存储过程,用于添加100条记录,有些记录的字段guid有值,有些没值,用于更新时,有值的不会受影响


create procedure sp_add_tableone_data
as
begin
    declare @count int
    declare @i int
 
	set @count=100;
	set @i=0;
 
    while @i<@count    --返回被 FETCH语句执行的最后游标的状态--
        begin          
            if @i%5=0
            begin
                    insert into task(guidValue,taskid,taskName)
                    values(newid(),@i,'数据')
            end
            else 
            begin
                    insert into task(taskid,taskName)
                    values(@i,'数据')
            end

            set @i+=1;
        end    
end
go

执行存储过程语句:exec sp_add_tableone_data --添加100条记录

image.png

3、创建存储过程,用于更新guid字段为null的记录,有值的记录不会受影响

create procedure sp_update_tableone_guid
as
begin
    declare @a int,@error int    
    declare @temp varchar(50)
    set @a=1
    set @error=0
    --申明游标为id
    declare table_cursor cursor 
    for (select id from task where guidValue is null)
    --打开游标--
    open table_cursor
    --开始循环游标变量--
    fetch next from table_cursor into @temp --将数据插入临时表
    while @@FETCH_STATUS = 0    --返回被 FETCH语句执行的最后游标的状态--
        begin
            update task set guidValue=newid() where id=@temp
            set @a=@a+1
            set @error= @error + @@ERROR   --记录每次运行sql后是否正确,0正确
            fetch next from table_cursor into @temp   --转到下一个游标,没有会死循环
        end    
    close table_cursor  --关闭游标
    deallocate table_cursor   --释放游标
end
go

执行存储过程语句:exec sp_update_tableone_guid --更新guid为null的值

image.png

select * from task --F845315D-5058-42EE-B5C4-B988867E5E5F

--truncate table task  --删除表记录,id重置