如何在两台SQL Server间迁移Person表中ID 1000至50000的记录?
最简SQL Server跨库迁移指定范围记录方案
针对你遇到的问题——要把Server 1中Person表ID在1000到50000之间的记录迁移到结构完全一致的Server 2同表,且要避开Generate Scripts全量迁移、CSV导出datetimeoffset异常的坑,这里有几个高效直接的方案:
方案1:链接服务器 + INSERT...SELECT(最直接的跨库直连操作)
这是不用中间文件的最优解,直接在目标服务器上执行语句完成迁移,完美适配datetimeoffset这类特殊数据类型。
步骤:
- 在Server 2上创建指向Server 1的链接服务器(如果还没创建的话):
EXEC sp_addlinkedserver @server = N'Server1_Linked', @srvproduct=N'', @provider=N'SQLNCLI', @datasrc=N'你的Server1实例名'; -- 可选:如果需要验证身份,添加登录映射 EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Server1_Linked', @useself=N'False', @locallogin=NULL, @rmtuser=N'Server1的用户名', @rmtpassword=N'Server1的密码';
- 执行迁移语句,直接筛选ID范围并插入目标表:
INSERT INTO Server2数据库.dbo.Person SELECT * FROM Server1_Linked.Server1数据库.dbo.Person WHERE ID BETWEEN 1000 AND 50000;
注意:如果有自增ID字段,要确保目标表的IDENTITY_INSERT已开启(如果需要保留原ID的话):
SET IDENTITY_INSERT Server2数据库.dbo.Person ON; -- 执行INSERT语句 SET IDENTITY_INSERT Server2数据库.dbo.Person OFF;
方案2:SQL Server导入导出向导(可视化操作,零脚本门槛)
这个官方工具比Generate Scripts灵活得多,支持自定义查询筛选数据,还能自动处理datetimeoffset这类复杂数据类型,不会出现CSV导出的格式问题。
操作步骤:
- 打开SSMS,右键Server 2的数据库 → 任务 → 导入数据
- 数据源选择Server 1的实例和对应数据库
- 目标选择Server 2的实例和对应数据库
- 到“指定表复制或查询”步骤时,选择编写查询以指定要传输的数据
- 输入查询语句:
SELECT * FROM Person WHERE ID BETWEEN 1000 AND 50000 - 后续步骤保持默认,点击完成即可开始迁移
方案3:bcp命令行工具(适合自动化/批量场景)
如果需要脚本化迁移,bcp是官方的高效工具,能精准处理datetimeoffset格式,避免手动导出CSV的错误。
导出(在Server 1所在机器执行):
bcp "SELECT * FROM Server1数据库.dbo.Person WHERE ID BETWEEN 1000 AND 50000" queryout "Person_1000_50000.dat" -S "Server1实例名" -d "Server1数据库" -U "用户名" -P "密码" -n
参数-n表示使用原生数据类型导出,完美保留datetimeoffset的格式。
导入(在Server 2所在机器执行):
bcp "Server2数据库.dbo.Person" in "Person_1000_50000.dat" -S "Server2实例名" -d "Server2数据库" -U "用户名" -P "密码" -n
方案推荐
- 如果你是一次性操作,SQL Server导入导出向导最省心,不用写脚本,可视化操作还能预览数据;
- 如果需要后续重复执行或集成到自动化流程,链接服务器+INSERT...SELECT或者bcp命令更合适。
内容的提问来源于stack exchange,提问作者Moksud Ahmed
相关产品推荐
相关产品推荐

