码迷,mamicode.com
首页 > 数据库 > 详细

SqlServer 利用游标批量更新数据

时间:2020-02-06 14:49:03      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:html   class   http   小数   cli   map   select   mmu   cas   

原文:SqlServer 利用游标批量更新数据

SqlServer 利用游标批量更新数据

Intro#

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

Sample#

下面来看一个实际示例:

Copy
-- 声明字段变量 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 ProvinceCursor INTO @ProvinceId,@RegionCode,@RegionName; END; CLOSE ProvinceCursor; DEALLOCATE ProvinceCursor;

Another Sample#

Copy
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 = 0 BEGIN UPDATE dbo.CommunityProjects SET CommunityId = CAST(ISNULL(( SELECT ZhongyiCommunityId FROM dbo.CommunityMappings WHERE FangdiCommunityId = @projectId ),‘-1‘) AS INT) WHERE OriginalProjectId = @projectId FETCH NEXT FROM My_Cursor INTO @projectId; END CLOSE My_Cursor; --关闭游标 DEALLOCATE My_Cursor; --释放游标

and more

Copy
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 BEGIN SET @provinceId =ISNULL((SELECT Id FROM dbo.Provinces WHERE Name = @RegionName), 0); IF @provinceId > 0 PRINT ‘UPDATE dbo.Provinces SET Code = ‘ + CONVERT(NVARCHAR(12), @RegionCode)+‘ WHERE Id = ‘ + CONVERT(NVARCHAR(12), @provinceId) +‘;‘; ELSE PRINT ‘INSERT INTO dbo.Provinces(Name,Code) VALUES(N‘‘‘ + @RegionName + ‘‘‘,‘ + CONVERT(NVARCHAR(12), @RegionCode)+ ‘);‘; FETCH NEXT FROM ProvinceCursor INTO @RegionCode, @RegionName; END; CLOSE ProvinceCursor; DEALLOCATE ProvinceCursor;

More#

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

Reference#

SqlServer 利用游标批量更新数据

标签:html   class   http   小数   cli   map   select   mmu   cas   

原文地址:https://www.cnblogs.com/lonelyxmas/p/12268412.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!