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

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 使用游标循环记录更新字段值
作者:小5聊基础
简介:一只喜欢全栈方向的程序员,欢迎咨询,尽绵薄之力答疑解惑
编程原则:Write Less Do More

【开发环境】
开发系统:Windows 10
开发语言:SQL Server
开发工具:SQL Server 2008 R2
文章作用:记录、备忘、总结、分享、理解
人生格言:勤能补拙

【主要知识点】
1、存储过程的创建
2、exc 执行存储过程
3、变量的定义,变量的赋值
4、游标的定义以及使用
5、if/else语句的使用
6、while语句的使用
7、begin end等同花括号{},语句块

【场景】
1、假设一张表的字段guid有些有值,有些没有值,需要通过sql语句批量处理guid为null的记录,并且赋值newid
备注:当然也可以在后台程序进行逻辑更新,这里主要是使用sql语句进行更新,相当于一个DBA的简单工作
2、创建存储过程,用于添加100条记录,有些记录的字段guid有值,有些没值,用于更新时,有值的不会受影响

 
/*
    Key:    samall five
    Value:    更新表新增字段,循环赋值guid=newid()
    Time:    2020.04.14
*/
 
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

2、创建存储过程,用于更新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重置

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
1月前
|
SQL 存储 数据库
SQL部分字段编码设置技巧与方法
在SQL数据库管理中,设置字段的编码对于确保数据的正确存储和检索至关重要
|
1月前
|
SQL 存储 Serverless
SQL语句拆分时间字段的技巧与方法
在数据库操作中,经常需要处理时间数据
|
1月前
|
SQL 存储 关系型数据库
SQL判断CHAR类型字段不为空的方法与技巧
在SQL查询中,判断一个CHAR类型字段是否不为空是一个常见的需求
|
1月前
|
SQL Oracle 关系型数据库
SQL如何添加字段记录:详细步骤与技巧
在数据库管理中,经常需要向已有的表中添加新的字段(列)或向表中插入新的记录
|
2月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
2月前
|
SQL 关系型数据库 MySQL
MySQL根据某个字段包含某个字符串或者字段的长度情况更新另一个字段的值,如何写sql
MySQL根据某个字段包含某个字符串或者字段的长度情况更新另一个字段的值,如何写sql
173 0
|
3月前
|
SQL 关系型数据库 MySQL
INSERT INTO t_a.tableName SELECT * FROM t_b.tableName 如何通过定义一个list对象,包含多个tableName,循环执行前面的sql,用MySQL的语法写
【8月更文挑战第7天】INSERT INTO t_a.tableName SELECT * FROM t_b.tableName 如何通过定义一个list对象,包含多个tableName,循环执行前面的sql,用MySQL的语法写
41 5
|
4月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
111 13
|
3月前
|
SQL Java Scala
flink-cdc SQL Server op 字段如何获取?
Flink CDC 是 Apache Flink 的组件,用于捕获数据库变更事件。对 SQL Server,通过 Debezium 连接器支持变更数据捕获。`op` 字段标识操作类型(INSERT、UPDATE、DELETE)。配置包括添加依赖及设定 Source 连接器,可通过 Flink SQL 或 Java/Scala 完成。示例查询利用 `op` 字段筛选处理变更事件。
134 1
|
4月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。