SqlServer 利用遊標批量更新資料
阿新 • • 發佈:2020-02-04
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 ProvinceCursor INTO @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 = 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
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
- 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/