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

下面来看一个实际示例:

  1. -- 声明字段变量
  2. DECLARE @RegionCode INT;
  3. DECLARE @RegionName NVARCHAR(64);
  4. DECLARE @ProvinceId INT;
  5. -- 声明游标
  6. DECLARE ProvinceCursor CURSOR FOR(
  7. SELECT Id AS ProvinceId, region.RegionCode,region.RegionName FROM dbo.Provinces AS province
  8. JOIN dbo.Regions AS region ON province.Name=SUBSTRING(region.RegionName,1, LEN(province.Name)) AND region.RegionType=1
  9. );
  10. -- 打开游标
  11. OPEN ProvinceCursor;
  12. -- 移动游标,加载数据
  13. FETCH NEXT FROM ProvinceCursor
  14. INTO @ProvinceId,@RegionCode,@RegionName;
  15. WHILE @@FETCH_STATUS = 0
  16. BEGIN
  17. -- 根据游标数据进行操作,这里只输出要执行的 SQL 脚本,也可以直接 UPDATE,看自己需要
  18. PRINT 'UPDATE dbo.Provinces SET Code = ' + CONVERT(NVARCHAR(12), @RegionCode)+', Name = N'''+@RegionName +''' WHERE Id = ' + CONVERT(NVARCHAR(12), @provinceId) +';';
  19. -- 移动游标到下一条数据
  20. FETCH NEXT FROM ProvinceCursor
  21. INTO @ProvinceId,@RegionCode,@RegionName;
  22. END;
  23. CLOSE ProvinceCursor;
  24. DEALLOCATE ProvinceCursor;
  1. DECLARE @projectId nvarchar(36) -- 声明变量
  2. DECLARE My_Cursor CURSOR --定义游标
  3. FOR (SELECT OriginalProjectId FROM dbo.CommunityProjects
  4. WHERE CommunityId = -1) --查出需要的集合放到游标中
  5. OPEN My_Cursor; --打开游标
  6. FETCH NEXT FROM My_Cursor INTO @projectId;
  7. WHILE @@FETCH_STATUS = 0
  8. BEGIN
  9. UPDATE dbo.CommunityProjects
  10. SET CommunityId = CAST(ISNULL((
  11. SELECT ZhongyiCommunityId FROM dbo.CommunityMappings
  12. WHERE FangdiCommunityId = @projectId
  13. ),'-1') AS INT)
  14. WHERE OriginalProjectId = @projectId
  15. FETCH NEXT FROM My_Cursor INTO @projectId;
  16. END
  17. CLOSE My_Cursor; --关闭游标
  18. DEALLOCATE My_Cursor; --释放游标

and more

  1. DECLARE @RegionCode INT;
  2. DECLARE @RegionName NVARCHAR(64);
  3. DECLARE @provinceId INT;
  4. DECLARE ProvinceCursor CURSOR FOR(
  5. SELECT RegionCode,
  6. RegionName
  7. FROM dbo.Regions
  8. WHERE RegionType = 1);
  9. OPEN ProvinceCursor;
  10. FETCH NEXT FROM ProvinceCursor
  11. INTO @RegionCode,
  12. @RegionName;
  13. WHILE @@FETCH_STATUS = 0
  14. BEGIN
  15. SET @provinceId =ISNULL((SELECT Id FROM dbo.Provinces WHERE Name = @RegionName), 0);
  16. IF @provinceId > 0
  17. PRINT 'UPDATE dbo.Provinces SET Code = ' + CONVERT(NVARCHAR(12), @RegionCode)+' WHERE Id = ' + CONVERT(NVARCHAR(12), @provinceId) +';';
  18. ELSE
  19. PRINT 'INSERT INTO dbo.Provinces(Name,Code) VALUES(N''' + @RegionName + ''',' + CONVERT(NVARCHAR(12), @RegionCode)+ ');';
  20. FETCH NEXT FROM ProvinceCursor
  21. INTO @RegionCode,
  22. @RegionName;
  23. END;
  24. CLOSE ProvinceCursor;
  25. DEALLOCATE ProvinceCursor;

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

版权声明:本文为weihanli原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/weihanli/p/12259724.html