编写存储过程实现同服务器下表间批量数据迁移(无需临时表)
同服务器表间批量数据迁移方案(无临时表/CSV)
针对你的场景,推荐两种无需临时表、无需CSV导入的批量迁移方案,均适合同服务器内的数据迁移,且能控制单批次数据量避免资源过载:
方案1:基于主键/唯一键的分批循环插入
利用源表的自增主键或唯一索引做分页依据,逐批次读取符合条件的数据直接插入目标表,不会产生临时表占用问题。
存储过程示例(SQL Server)
CREATE PROCEDURE dbo.BatchCopySourceToDestination AS BEGIN SET NOCOUNT ON; -- 配置批次大小,可根据服务器性能调整 DECLARE @BatchSize INT = 2000; DECLARE @LastProcessedId INT = 0; DECLARE @CurrentMaxId INT; WHILE 1 = 1 BEGIN -- 批量插入当前批次数据 INSERT INTO DestinationTable (Col1, Col2, Col3, ...) SELECT Col1, Col2, Col3, ... FROM SourceTable WHERE Id > @LastProcessedId -- 替换为你的实际筛选条件 AND YourFilterColumn = 'FilterValue' ORDER BY Id OFFSET 0 ROWS FETCH NEXT @BatchSize ROWS ONLY; -- 获取当前批次的最大主键值,用于下一批次的起始位置 SELECT @CurrentMaxId = MAX(Id) FROM SourceTable WHERE Id > @LastProcessedId AND YourFilterColumn = 'FilterValue'; -- 无更多数据则退出循环 IF @CurrentMaxId IS NULL OR @CurrentMaxId = @LastProcessedId BREAK; SET @LastProcessedId = @CurrentMaxId; -- 可选:每批次后短暂等待,降低数据库瞬时压力 WAITFOR DELAY '00:00:00.100'; END; END;
优势
- 完全依赖源表主键分页,避免数据重复或遗漏
- 无需临时表,所有操作直接在源/目标表间完成
- 批次大小可控,避免占用过多数据库资源
- 同服务器内数据读取/插入性能高效
方案2:基于TOP+存在性判断的分批插入
如果源表没有主键,但存在能唯一标识数据的字段组合(如创建时间+业务唯一ID),可以用此方案,通过目标表的存在性判断避免重复插入。
存储过程示例(SQL Server)
CREATE PROCEDURE dbo.BatchCopySourceToDestination_NoPK AS BEGIN SET NOCOUNT ON; DECLARE @BatchSize INT = 2000; DECLARE @InsertCount INT = 1; WHILE @InsertCount > 0 BEGIN BEGIN TRANSACTION; -- 插入未迁移的符合条件数据 INSERT INTO DestinationTable (Col1, Col2, UniqueBizId, CreateTime, ...) SELECT TOP (@BatchSize) Col1, Col2, UniqueBizId, CreateTime, ... FROM SourceTable WHERE YourFilterColumn = 'FilterValue' -- 排除已插入目标表的数据 AND NOT EXISTS ( SELECT 1 FROM DestinationTable dt WHERE dt.UniqueBizId = SourceTable.UniqueBizId AND dt.CreateTime = SourceTable.CreateTime ) ORDER BY CreateTime, UniqueBizId; -- 获取本次插入行数,无数据则退出循环 SET @InsertCount = @@ROWCOUNT; COMMIT TRANSACTION; WAITFOR DELAY '00:00:00.100'; END; END;
关键注意事项
- 确保目标表字段与源表字段一一对应,或在INSERT/SELECT语句中明确指定字段列表
- 若目标表有非聚集索引,建议批量迁移前禁用索引,迁移完成后重建,大幅提升插入速度
- 可根据服务器CPU、内存情况调整
@BatchSize,测试出最优批次量级 - 尽量在业务低峰期执行存储过程,避免影响在线业务
内容的提问来源于stack exchange,提问作者Prashanth Subramanian
相关产品推荐
相关产品推荐

