You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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是最佳选择。

  1. 打开SQL Server Data Tools(SSDT),新建一个Integration Services项目;
  2. 在“连接管理器”里分别添加服务器A和服务器B的SQL Server连接(各自配置对应的账号密码);
  3. 拖一个“数据流任务”到控制流面板,双击进入数据流;
  4. 拖一个“OLE DB源”,配置为服务器A的数据库,选择你要查询的表或者写自定义SQL;
  5. 拖一个“OLE DB目标”,配置为服务器B的数据库,选择目标表;
  6. 把源组件和目标组件连接起来,配置字段映射(确保字段类型匹配);
  7. 点击运行按钮执行,或者部署到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

火山引擎 最新活动