惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News and Events Feed by Topic
D
Docker
云风的 BLOG
云风的 BLOG
F
Fortinet All Blogs
F
Full Disclosure
H
Hackread – Cybersecurity News, Data Breaches, AI and More
P
Proofpoint News Feed
Microsoft Azure Blog
Microsoft Azure Blog
WordPress大学
WordPress大学
The GitHub Blog
The GitHub Blog
L
LangChain Blog
H
Help Net Security
B
Blog
T
Tailwind CSS Blog
V
V2EX
博客园_首页
阮一峰的网络日志
阮一峰的网络日志
人人都是产品经理
人人都是产品经理
The Cloudflare Blog
Recent Announcements
Recent Announcements
aimingoo的专栏
aimingoo的专栏
美团技术团队
A
About on SuperTechFans
C
Cybersecurity and Infrastructure Security Agency CISA
K
Kaspersky official blog
I
InfoQ
Project Zero
Project Zero
I
Intezer
Google DeepMind News
Google DeepMind News
博客园 - 【当耐特】
Hugging Face - Blog
Hugging Face - Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Threat Research - Cisco Blogs
Last Week in AI
Last Week in AI
C
Cyber Attacks, Cyber Crime and Cyber Security
G
GRAHAM CLULEY
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
AWS News Blog
AWS News Blog
Spread Privacy
Spread Privacy
S
Securelist
Recorded Future
Recorded Future
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园 - 叶小钗
S
Security Affairs
Blog — PlanetScale
Blog — PlanetScale
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
The Hacker News
The Hacker News

博客园 - TanSea

VMware虚拟机下Linux系统(Ubuntu桌面版)微服务环境搭建 - 构建篇 VMware虚拟机下Linux系统(Ubuntu桌面版)微服务环境搭建 - Gogs篇 VMware虚拟机下Linux系统(Ubuntu桌面版)微服务环境搭建 - Docker篇 VMware虚拟机下Linux系统(Ubuntu桌面版)微服务环境搭建 - Jenkins篇 VMware虚拟机下Linux系统(Ubuntu桌面版)微服务环境搭建 - 准备篇 Sql Server 查询数据库表结构 MAUI Blazor+MASA开发安卓应用学习笔记 - 设置图标和初始屏幕 MAUI Blazor+MASA开发安卓应用学习笔记 - 设置APP格式、名称、版本信息 MAUI Blazor+MASA开发安卓应用学习笔记 - 新建项目和发布 一道SQL面试题的解题思路 Windows10设置默认简体美式键盘输入法 C# 历史版本特性变更(更新到C# 11) SQL Server Report Builder RDLC按记录数分页 一次Exchange邮箱接口的开发经历 SQL Server分页查询进化史 一次.NET项目反编译的实战经验(WinForm) 点石成金-访客至上的网站设计秘笈 读书笔记 Windows7使用无线网卡建立WiFi热点 程序员的职业素养 读书笔记 - 第14章 辅导、学徒期与技艺
Sql Server 分批复制数据
TanSea · 2024-06-11 · via 博客园 - TanSea

添加辅助列

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;

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