Python实现从SQL Server服务器A查询数据并插入服务器B
嘿,这个跨SQL Server服务器迁移数据的需求太常见了,给你几个实测有效的具体实现方案,你可以根据自己的使用频率、数据量大小来选:
方法一:创建链接服务器(适合频繁跨服务器操作)
链接服务器是最常用的方式,一旦配置好之后,后续操作就跟访问本地表差不多了。
步骤1:在服务器A上创建指向服务器B的链接服务器
打开服务器A的SSMS,执行下面的脚本(记得替换占位符为你的实际信息):
-- 创建链接服务器 EXEC sp_addlinkedserver @server = N'LinkedServerB', -- 自定义的链接服务器名称,随便取 @srvproduct=N'SQL Server'; -- 设置链接服务器的登录凭据(因为两台服务器账号密码不同,用SQL认证) EXEC sp_addlinkedsrvlogin @rmtsrvname=N'LinkedServerB', @useself=N'False', @locallogin=NULL, @rmtuser=N'UserB', -- 服务器B的SQL账号 @rmtpassword=N'PasswordB'; -- 服务器B的密码
步骤2:执行跨服务器插入操作
配置好之后,直接写INSERT语句就可以了,比如:
-- 假设目标表结构和源表一致,直接插入所有数据 INSERT INTO [LinkedServerB].[DB_B].[dbo].[TargetTable] SELECT * FROM [DB_A].[dbo].[SourceTable] WHERE YourFilterCondition; -- 按需添加过滤条件 -- 如果字段顺序或数量不一致,一定要指定字段列表(推荐这么做,避免出错) INSERT INTO [LinkedServerB].[DB_B].[dbo].[TargetTable] (Col1, Col2, Col3) SELECT SourceCol1, SourceCol2, SourceCol3 FROM [DB_A].[dbo].[SourceTable] WHERE YourFilterCondition;
方法二:使用OPENROWSET(适合一次性/偶尔操作)
如果只是偶尔做一次数据迁移,不想创建链接服务器,可以用OPENROWSET直接在查询里指定服务器B的连接信息。
步骤1:先启用Ad Hoc Distributed Queries(默认可能未开启)
在服务器A的SSMS中执行:
sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE;
步骤2:执行插入语句
直接把服务器B的连接信息写到OPENROWSET里,示例:
INSERT INTO OPENROWSET( 'SQLNCLI', -- 驱动名,SQL Server一般用这个 'Server=ServerB;Uid=UserB;Pwd=YourPasswordB;', -- 服务器B的连接字符串 'DB_B.dbo.TargetTable' -- 指定目标表 ) SELECT SourceCol1, SourceCol2, SourceCol3 FROM [DB_A].[dbo].[SourceTable] WHERE YourFilterCondition;
方法三:使用SSIS(适合复杂ETL/定时任务)
如果需要做数据清洗、转换,或者要定时自动执行,SSIS是最佳选择。
- 打开SQL Server Data Tools(SSDT),新建一个Integration Services项目;
- 在“连接管理器”里分别添加服务器A和服务器B的SQL Server连接(各自配置对应的账号密码);
- 拖一个“数据流任务”到控制流面板,双击进入数据流;
- 拖一个“OLE DB源”,配置为服务器A的数据库,选择你要查询的表或者写自定义SQL;
- 拖一个“OLE DB目标”,配置为服务器B的数据库,选择目标表;
- 把源组件和目标组件连接起来,配置字段映射(确保字段类型匹配);
- 点击运行按钮执行,或者部署到SQL Server代理里设置定时任务。
方法四:bcp工具+批量插入(适合超大批量数据)
如果数据量特别大(比如几百万行以上),用bcp导出成文本文件再导入会比直接跨服务器查询快很多。
步骤1:从服务器A导出数据到本地文件
打开命令提示符(CMD),执行:
bcp "SELECT Col1, Col2, Col3 FROM DB_A.dbo.SourceTable WHERE YourFilterCondition" queryout "C:\Temp\DataExport.txt" -S ServerA -U UserA -P PasswordA -c -t, -r\n
参数说明:
-c:用纯文本格式导出-t,:指定字段分隔符为逗号-r\n:指定行分隔符为换行符
步骤2:把文件导入到服务器B
同样在CMD里执行:
bcp DB_B.dbo.TargetTable in "C:\Temp\DataExport.txt" -S ServerB -U UserB -P PasswordB -c -t, -r\n
注意:如果文件不在服务器B所在机器上,需要把文件传到服务器B的本地路径,或者用-S指定服务器B的时候确保文件路径是服务器B能访问到的(比如共享文件夹)。
内容的提问来源于stack exchange,提问作者Svan




