首页 > 数据库 >Sql Server 分批复制数据

Sql Server 分批复制数据

时间:2024-06-11 15:55:39浏览次数:26  
标签:InsertedPrimaryKeys BEGIN dbo 分批 IsCopied Server Sql Id SourceTable

添加辅助列

ALTER TABLE dbo.SourceTable ADD IsCopied BIT NOT NULL DEFAULT 0;

这里要给源表添加一个标识列,是因为我不想用到ORDER BY。当然也可以改成不用辅助列,用ORDER BY的方式。

创建目标表

SELECT * INTO DestinationTable FROM dbo.SourceTable WHERE 1=0;

当条件不满足0时,仅复制表结构

分批复制数据

DECLARE @BatchSize INT=1000;
DECLARE @RowsAffected INT;
DECLARE @InsertedPrimaryKeys TABLE (Id BIGINT NOT NULL);

WHILE 1=1
BEGIN
    BEGIN TRANSACTION
    INSERT INTO dbo.DestinationTable
    OUTPUT inserted.Id INTO @InsertedPrimaryKeys
    SELECT TOP (@BatchSize) * FROM dbo.SourceTable WHERE IsCopied=0;
    SET @RowsAffected=@@ROWCOUNT;
    IF @RowsAffected>0
    BEGIN
        UPDATE dbo.SourceTable SET IsCopied=1 WHERE IsCopied=0 AND Id IN (SELECT Id FROM @InsertedPrimaryKeys);
        COMMIT TRANSACTION;
    END
    ELSE
    BEGIN
        ROLLBACK TRANSACTION;
        BREAK;
    END    
END

1、取BatchSize条数据插入到新表,并将Id保存到InsertedPrimaryKeys。

2、将插入行的数量保存到RowsAffected。

3、如果有插入行,根据Id把标识列改成已复制

4、当未插入任何行时,循环结束

删除辅助列

ALTER TABLE dbo.SourceTable DROP COLUMN IsCopied;
ALTER TABLE dbo.DestinationTable DROP COLUMN IsCopied;

这里目标表也是有标识列的,一并删除

标签:InsertedPrimaryKeys,BEGIN,dbo,分批,IsCopied,Server,Sql,Id,SourceTable
From: https://www.cnblogs.com/TanSea/p/18242188/Sql-Server-Copy-Data-In-Batches

相关文章

  • json-server 快速搭建REST API 服务器
    json-server快速搭建RESTAPI服务器★认识json-server官方文档参考 json-server是一个非常流行的开源工具,用于快速搭建一个完整的RESTAPI服务器。它使用JSON文件作为数据源,通过简单的配置即可模拟复杂的服务器功能,非常适合前端开发者在没有后端支持的情况下进行开发和......
  • Mssql数据注入
    1.查询用户创建的数据表selectid,name fromsysobjectswherextype='u'; 2.查询用户创建数据表的具体列名select*fromsyscolumnswhere id=上一步获取的id值;3.查询具体内容selectid,字段名from数据表名;4.数据库名db_name()5.用户登录名suser_name()6......
  • 以sqlilabs靶场为例,讲解SQL注入攻击原理【54-65关】
    【Less-54】与前面的题目不同是,这里只能提交10次,一旦提交超过十次,数据会重新刷新,所有的步骤需要重来一次。解题步骤:根据测试,使用的是单引号闭合。#判断字段的数量?id=1'orderby3--aaa#获取数据库的名字?id=-1'unionselect1,2,database()--aa#获取数据......
  • mysql之数据聚合
    官方文档SUM(column)用于计算指定列的总和。示例:计算每个部门员工的总工资SELECTdepartment,SUM(salary)AStotal_salaryFROMemployeesGROUPBYdepartment;AVG(column)用于计算指定列的平均值。示例:计算每个部门员工的平均工资SELECTdepartment,AVG(sal......
  • Java 开发面试题精选:Mysql 一篇全搞定
    前言在高级Java开发工程师的面试中,MySQL作为常见的数据库技术,其掌握程度往往是评估候选人综合能力的重要组成部分。在这篇文章中,我精选了一些最可能被问到的与MySQL相关的面试题目,这些题目可以全面考察候选人的理论知识、实战经验和问题解决能力,不管你是准备求职的小伙伴,还是......
  • MySQL复习题(期末考试)
    MySQL复习题(期末考试)1.MySQL支持的日期类型?DATE,DATETIME,TIMESTAMP,TIME,TEAR2.为表添加列的语法?altertable表名addcolumn列名数据类型;3.修改表数据类型的语法是?altertable表名modify列名新数据类型;4.更改表的列名的语法?altertable表名(t)change......
  • Springboot + Mybatis Plus整合Sqlite3
    什么是Sqlite3sqlite3是一个进程内的库,实现了自给自足、无服务器、零配置、事务性的SQL数据库引擎。它是一个增长最快的数据库引擎。它不是一个独立的进程,可以按应用程序需求进行静态或动态连接,SQLite直接访问其存储文件。为什么要使用Sqlite3不需要一个单独的服务器进程......
  • MySql JOIN
    MySqlJOIN背景最近在做一些项目时需要对数据库进行简单的select,由于之前一直在做HTML+JS+CSS所有对数据库不是很了解,现在从0开始学习,每天学习一点,做个理解总结。有理解偏差欢迎留言指正。简介JOIN用于根据两个或多个表之间关系,查询数据innerjoin内连接leftj......
  • MyBatisX插件逆向工程和SQL生成使用
    1.MyBatisX插件逆向工程将表映射成实体类在IDEA中装好MyBatisX插件并连接数据库后,对咬映射成实体类的表点击鼠标右键,如下图所示:之后会弹出如下界面:然后根据如图信息进行配置,点击next。如果使用的是MyBatis-Plus3直接按照下图选项即可:至此结束逆向工程将表映射成实体类。......
  • Navicat导入json文件(json文件数据导入到MySQL表中)
    天行健,君子以自强不息;地势坤,君子以厚德载物。每个人都有惰性,但不断学习是好好生活的根本,共勉!文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。文章目录一、介绍二、准备工作1.工具2.建表3.Json文件三、JSON文件数据导入MySQL表1.导入文件入口2.......