SqlServer 利用游标批量更新数据
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 利用游标批量更新数据相关推荐
- FreeSql (十四)批量更新数据
FreeSql支持丰富的更新数据方法,支持单条或批量更新,在特定的数据库执行还可以返回更新后的记录值. var connstr = "Data Source=127.0.0.1;Port=3 ...
- mysql 批量更新数据 备份_mysql 批量更新与批量更新多条记录的不同值实现方法...
批量更新 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other ...
- Mybatis批量更新数据
Mybatis批量更新数据 第一种方式 [html] view plaincopy print? <update id="updateBatch" parameterType ...
- 批量更新数据(BatchUpdate)
批量更新数据(BatchUpdate) /// <summary> /// 批量更新数据,注意:如果有timestamp列,要移除 /// </summary> /// < ...
- php怎么更新多条数据,PHP中批量更新数据表中多条记录
class test { /** * 创建像这样的查询: "IN('a','b')"; * * @author wengxianhu * @created to 2013-05-2 ...
- mysql 存储过程 批量导入数据_sql 利用存储过程批量导入数据
什么是 存储过程(stored procedure)是一组为了完成特定功能的sql语句集,是利用sql server所提供的transact-sql语言所编写的程序.经编译后存储在中.存储过程是数据库 ...
- oracle使用游标批量删除数据,oracle 游标批量处理数据
declare --开始时间 v_date_start date:= to_date('2015-05-28 00:00:00','yyyy-mm-dd hh24:mi:ss'); --结束时间 v_ ...
- oracle批量更新数据从另一表_全市场期货数据的批量下载和更新
不管是研究套利策略,还是多因子策略,都需要多品种的历史数据,所以下面介绍一下,如何调用vnpy的数据下载模块,来下载全市场的期货数据. 批量下载 1)设置合约品种 首先,我们要先生成一个字典,来指定需 ...
- mybatis批量更新数据三种方法效率对比
探讨批量更新数据三种写法的效率问题. 实现方式有三种, 1> 用for循环通过循环传过来的参数集合,循环出N条sql,需要在db链接url后面带一个参数 &allowMultiQuer ...
最新文章
- java itext word操作_使用JAVA中的Apache POI和iText从Word(DOC)创建PDF
- 如何在程序中生成崩溃转储dump文件以及如何分析dump
- spring集成mq_使用Spring Integration Java DSL与Rabbit MQ集成
- python saltstack web_saltstack web uiweb平台界面
- 资阳停车场系统推荐_详细讲解停车场管理车牌识别系统安装
- tensorflow 学习资料汇总
- .net framework 4.0 安装失败解决办法
- 无人车制胜关键:Apollo决策系统全面剖析
- 苦口之药的拼音及解释
- 即使在微软 Azure 上,Linux 也大有一统天下之势!
- Toast-Android 专属浮动小提示
- linux阻止程序,Linux:阻止某些应用程序/主机名的IPv6
- mac连接服务器出错双系统,mac使用bootcamp安装双系统遇到的问题及解决方案
- 弱小目标检测领域下图像的信噪比(SNR)计算方法
- [转]FastDb介绍
- 《倚天》中张三丰一席话引发的思考
- C语言课后问答题汇总
- 从零开始制作STM32F103RCT6小车(一)
- 【PR 基础】轨道遮罩键、交叉溶解的简单使用
- 【点云3D目标检测】跑通CIA-SSD过程中的一些报错集锦