美文网首页SQL ServerAmazing .NETSQL server
SqlServer 利用游标批量操作数据

SqlServer 利用游标批量操作数据

作者: 天天向上卡索 | 来源:发表于2020-02-04 15:41 被阅读0次

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

相关文章

  • SqlServer 利用游标批量操作数据

    SqlServer 利用游标批量更新数据 Intro 游标在有时候会很有用,在更新一部分不多的数据时,可以很方便的...

  • Java操作Solr —— SolrJ

    摘要:Solr,Java,分页,游标 引入依赖 引入依赖 批量查询数据 使用翻页 使用游标分页读取的方式,在大数据...

  • RedisTemplate批量操作

    RedisTemplate批量添加操作教程,利用pipeline批量操作;multiSet()批量操作;for循环...

  • Sqlserver存储过程如何写循环

    Sqlserver循环游标写法存储过程中循环的写法Sqlserver各种循环写法Sqlserver自带的while...

  • sqlserver 游标

    游标更新删除当前数据 1.声明游标 2.打开游标 3.声明游标提取数据所要存放的变量 4.定位游标到哪一行 5.关...

  • sqlserver 游标-for

    SQL Server游标 什么是游标 结果集就是select查询之后返回的所有行数据的集合。 游标是处理结果集的一...

  • sql server 游标

    定位到结果集中某一行 游标分类 静态游标(Static):在操作游标的时候,数据发生变化,游标中数据不变。 动态游...

  • Python模块·PyMySQL数据库

    一、PyMySQL实现思路流程 1.建立连接2.创建游标:游标数据库操作的接口3.数据库操作(建表、插入数据、查询...

  • chapter12_数据库编程_2_游标

    处理多行数据的操作要使用游标cursor 游标有四个基本操作:(1) 声明 DECLARE(2) 打开 OPEN(...

  • JDBC批量插入mysql数据库

    批量插入mysql的使用场景 在sqlServer里有BulkInsert,可以高效的插入数据。在Java中,我们...

网友评论

    本文标题:SqlServer 利用游标批量操作数据

    本文链接:https://www.haomeiwen.com/subject/xrbrxhtx.html