SqlServer 利用游标批量更新数据

Intro

游标在有时候会很有用,在更新一部分不多的数据时,可以很方便的更新数据,不需要再写一个小工具来做了,直接写 SQL 就可以了

Sample

下面来看一个实际示例:

-- 声明字段变量
DECLARE @RegionCode INT;
DECLARE @RegionName NVARCHAR(64);
DECLARE @ProvinceId INT;
-- 声明游标
DECLARE ProvinceCursor CURSOR FOR(
SELECT Id AS ProvinceId, region.RegionCode,region.RegionName FROM dbo.Provinces AS province
JOIN dbo.Regions AS region ON province.Name=SUBSTRING(region.RegionName,1, LEN(province.Name)) AND region.RegionType=1
);
-- 打开游标
OPEN ProvinceCursor;
-- 移动游标,加载数据
FETCH NEXT FROM ProvinceCursor
INTO @ProvinceId,@RegionCode,@RegionName;
-- 游标加载数据成功WHILE @@FETCH_STATUS = 0
BEGIN--根据游标数据进行操作,这里只输出要执行的 SQL 脚本,也可以直接 UPDATE,看自己需要PRINT 'UPDATE dbo.Provinces SET Code = ' + CONVERT(NVARCHAR(12), @RegionCode)+', Name = N'''+@RegionName +''' WHERE Id = ' + CONVERT(NVARCHAR(12), @provinceId) +';';-- 移动游标到下一条数据FETCH NEXT FROM ProvinceCursorINTO @ProvinceId,@RegionCode,@RegionName;
END;
CLOSE ProvinceCursor;
DEALLOCATE ProvinceCursor;

Another Sample

DECLARE @projectId nvarchar(36)-- 声明变量
DECLARE My_Cursor CURSOR --定义游标
FOR (SELECT OriginalProjectId FROM dbo.CommunityProjects
WHERE CommunityId = -1)--查出需要的集合放到游标中
OPEN My_Cursor; --打开游标
FETCH NEXT FROM My_Cursor INTO @projectId;
WHILE @@FETCH_STATUS = 0BEGINUPDATE dbo.CommunityProjectsSET CommunityId = CAST(ISNULL((SELECT ZhongyiCommunityId FROM dbo.CommunityMappingsWHERE FangdiCommunityId = @projectId),'-1') AS INT)WHERE OriginalProjectId = @projectIdFETCH NEXT FROM My_Cursor INTO @projectId;END
CLOSE My_Cursor; --关闭游标
DEALLOCATE My_Cursor; --释放游标

and more

DECLARE @RegionCode INT;
DECLARE @RegionName NVARCHAR(64);
DECLARE @provinceId INT;
DECLARE ProvinceCursor CURSOR FOR(
SELECT RegionCode,RegionName
FROM dbo.Regions
WHERE RegionType = 1);
OPEN ProvinceCursor;
FETCH NEXT FROM ProvinceCursor
INTO @RegionCode,@RegionName;
WHILE @@FETCH_STATUS = 0
BEGINSET @provinceId =ISNULL((SELECT Id FROM dbo.Provinces WHERE Name = @RegionName), 0);IF @provinceId > 0PRINT 'UPDATE dbo.Provinces SET Code = ' + CONVERT(NVARCHAR(12), @RegionCode)+' WHERE Id = ' + CONVERT(NVARCHAR(12), @provinceId) +';';ELSEPRINT 'INSERT INTO dbo.Provinces(Name,Code) VALUES(N''' + @RegionName + ''',' + CONVERT(NVARCHAR(12), @RegionCode)+ ');';FETCH NEXT FROM ProvinceCursorINTO @RegionCode,@RegionName;
END;
CLOSE ProvinceCursor;
DEALLOCATE ProvinceCursor;

More

在做一些小数据量的数据操作时,游标会非常方便,而且游标比较灵活,你可以只生成更新数据的SQL,也可以打印出数据更新前后的值,以便错误更新数据之后的数据恢复

Reference

  • https://www.cnblogs.com/xielong/p/5941595.html

  • https://www.cnblogs.com/mrma/p/3794520.html

  • https://www.sqlservertutorial.net/sql-server-stored-procedures/sql-server-cursor/

  • https://www.mssqltips.com/sqlservertip/1599/sql-server-cursor-example/

SqlServer 利用游标批量更新数据相关推荐

  1. FreeSql (十四)批量更新数据

    FreeSql支持丰富的更新数据方法,支持单条或批量更新,在特定的数据库执行还可以返回更新后的记录值. var connstr = "Data Source=127.0.0.1;Port=3 ...

  2. mysql 批量更新数据 备份_mysql 批量更新与批量更新多条记录的不同值实现方法...

    批量更新 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other ...

  3. Mybatis批量更新数据

    Mybatis批量更新数据 第一种方式 [html] view plaincopy print? <update id="updateBatch" parameterType ...

  4. 批量更新数据(BatchUpdate)

    批量更新数据(BatchUpdate) /// <summary> /// 批量更新数据,注意:如果有timestamp列,要移除 /// </summary> /// < ...

  5. php怎么更新多条数据,PHP中批量更新数据表中多条记录

    class test { /** * 创建像这样的查询: "IN('a','b')"; * * @author wengxianhu * @created to 2013-05-2 ...

  6. mysql 存储过程 批量导入数据_sql 利用存储过程批量导入数据

    什么是 存储过程(stored procedure)是一组为了完成特定功能的sql语句集,是利用sql server所提供的transact-sql语言所编写的程序.经编译后存储在中.存储过程是数据库 ...

  7. oracle使用游标批量删除数据,oracle 游标批量处理数据

    declare --开始时间 v_date_start date:= to_date('2015-05-28 00:00:00','yyyy-mm-dd hh24:mi:ss'); --结束时间 v_ ...

  8. oracle批量更新数据从另一表_全市场期货数据的批量下载和更新

    不管是研究套利策略,还是多因子策略,都需要多品种的历史数据,所以下面介绍一下,如何调用vnpy的数据下载模块,来下载全市场的期货数据. 批量下载 1)设置合约品种 首先,我们要先生成一个字典,来指定需 ...

  9. mybatis批量更新数据三种方法效率对比

    探讨批量更新数据三种写法的效率问题. 实现方式有三种, 1> 用for循环通过循环传过来的参数集合,循环出N条sql,需要在db链接url后面带一个参数  &allowMultiQuer ...

最新文章

  1. java itext word操作_使用JAVA中的Apache POI和iText从Word(DOC)创建PDF
  2. 如何在程序中生成崩溃转储dump文件以及如何分析dump
  3. spring集成mq_使用Spring Integration Java DSL与Rabbit MQ集成
  4. python saltstack web_saltstack web uiweb平台界面
  5. 资阳停车场系统推荐_详细讲解停车场管理车牌识别系统安装
  6. tensorflow 学习资料汇总
  7. .net framework 4.0 安装失败解决办法
  8. 无人车制胜关键:Apollo决策系统全面剖析
  9. 苦口之药的拼音及解释
  10. 即使在微软 Azure 上,Linux 也大有一统天下之势!
  11. Toast-Android 专属浮动小提示
  12. linux阻止程序,Linux:阻止某些应用程序/主机名的IPv6
  13. mac连接服务器出错双系统,mac使用bootcamp安装双系统遇到的问题及解决方案
  14. 弱小目标检测领域下图像的信噪比(SNR)计算方法
  15. [转]FastDb介绍
  16. 《倚天》中张三丰一席话引发的思考
  17. C语言课后问答题汇总
  18. 从零开始制作STM32F103RCT6小车(一)
  19. 【PR 基础】轨道遮罩键、交叉溶解的简单使用
  20. 【点云3D目标检测】跑通CIA-SSD过程中的一些报错集锦

热门文章

  1. 基于MySQL的高可用可扩展架构探讨
  2. 最近对latin-1这个字符集产生了不少好感
  3. 8-12 canvas专题-阶段练习一(上)
  4. c# XML和实体类之间相互转换(序列化和反序列化)
  5. linux shell 中文件编码查看及转换方法
  6. 能源项目xml文件 -- app-context.xml
  7. 纯css3实现的鼠标悬停动画按钮
  8. NHibernate中的SchemaExport
  9. 基于Prometheus的.NET 4.x应用服务监控
  10. 如何在 C# 循环中捕获局部变量?