SqlServer 利用游标批量更新数据

Intro

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

Sample

下面来看一个实际示例:

  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;

Another Sample

  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;

More

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

Reference

SqlServer 利用游标批量更新数据的更多相关文章

  1. Sql Server利用游标批量清空数据表

    先吐槽一下,由于公司要为新客户部署一个全新的系统,然而公司并没有空库,所以只能把正在线上运行的数据库给备份,然后清空相关数据 下面分享一下我在做清空数据库时写的一个批量清空数据表的方法 思路:查询出该 ...

  2. Neo4j 第五篇:批量更新数据

    相比图形数据的查询,Neo4j更新图形数据的速度较慢,通常情况下,Neo4j更新数据的工作流程是:每次数据更新都会执行一次数据库连接,打开一个事务,在事务中更新数据.当数据量非常大时,这种做法非常耗时 ...

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

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

  4. 批量更新数据小心SQL触发器的陷阱

    批量更新数据时候,Inserted和Deleted临时表也是批量的,但触发器只会调用执行一次!两个概念千万不要弄混淆! 错误的理解:例如:创建在A表上创建了一个Update触发器,里面写的是Updat ...

  5. SQL批量更新数据

    SQL批量更新数据 step1:导入Excel数据, 具体见百度.注意点:一列中含有float型数据和文本数据的时候,导入要将Excel中的表格属性改成文本,或在数字项目前加个单引号.   step2 ...

  6. mybatis学习之路----批量更新数据两种方法效率对比

    原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方 ...

  7. mysql 常用命令,连接数据库,查看建表语句,批量导入数据,批量更新数据,连接查询

    1. 1)MySQL 连接本地数据库,从cmd中进入mysql命令编辑器: root root分别为用户名和密码 mysql -uroot -proot 2)MySQL 连接本地数据库,用户名为“ro ...

  8. mysql下的将多个字段名的值复制到另一个字段名中(批量更新数据)字符串拼接cancat实战例子

    mysql下的将多个字段名的值复制到另一个字段名中(批量更新数据)mysql字符串拼接cancat实战例子: mysql update set 多个字段相加,如果是数字相加可以直接用+号(注:hund ...

  9. 批量更新数据(BatchUpdate)

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

随机推荐

  1. 第二阶段:2.商业需求文档MRD:3.MRD-目标用户分析

    以上是对目标市场的分析! 用户描述是定性.市场统计是定量.用用户分类模型去剖析用户分类. 例子.做百度推广时候的用户分析.不同角色的关注点不同.三个情景:广告售卖,广告投放,分析评估. 用户的使用习惯 ...

  2. javaweb项目启动时自动启动rmi服务器实例

    1.我们先写一个web项目启动时需要运行的类RmiRegisterServlet.java package com.mx.Servlet; import javax.servlet.ServletCo ...

  3. c# T4模板生成实体类(sqlserver)

    1.用vs新建tt文件. 2.tt文件保存就自动运行 3.tt文件代码如下,设置生成cs文件的命名空间和生成地址 <#@ template language="C#" hos ...

  4. windows 8.0 mysql 修改root 密码

    Mysql 忘记root密码和修改root密码的解决方法(小结) 一.以下是Windows操作系统的操作步骤: 1. 关闭正在运行的MySQL服务-->net stop mysql 2. 打开D ...

  5. MyBatis学习与使用(一)

    写在前面—— 用 MyBatis 也做过几个项目了,但是一直没有很深入的去理解这个框架,最近决定从头开始学习和整理MyBatis. 之前开发的项目并不是我先创建的,等我介入的时候发现他们已经稍稍封装了 ...

  6. ansible批量部署tomcat

    1.1 构建目录结构 此操作是安装nginx+mysql+tomcat+db的目录结构,可以参考一下,不错~ mkdir -p /ansible/roles/{nginx,mysql,tomcat,d ...

  7. pyspider遇到的第一个坑:Active Tasks成功,Results无内容

    #!/usr/bin/env python# -*- encoding: utf-8 -*-# Created on 2020-01-04 16:30:27# Project: HomeWork fr ...

  8. 如何使用CSS3中的结构伪类选择器和伪元素选择器

    结构伪类选择器介绍 结构伪类选择器是用来处理一些特殊的效果. 结构伪类选择器属性说明表 属性 描述 E:first-child 匹配E元素的第一个子元素. E:last-child 匹配E元素的最后一 ...

  9. 「SP25784」BUBBLESORT - Bubble Sort 解题报告

    SP25784 BUBBLESORT - Bubble Sort 题目描述 One of the simplest sorting algorithms, the Bubble Sort, can b ...

  10. 1065 单身狗 (25分)C语言

    单身狗"是中文对于单身人士的一种爱称.本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱. 输入格式: 输入第一行给出一个正整数 N(≤ 50 000),是已知夫妻/伴侣的对数:随 ...