如何通过SSIS用单个dtsx文件更新不同服务器两数据库的emp表
单SSIS包实现平面文件同步更新跨服务器双库emp表方案
这个需求完全可以在单个dtsx包内实现,不需要拆分多个包,核心是利用SSIS数据流的多播能力单次读取源数据、多分发出流,具体落地步骤如下:
前期准备
- 先核对平面文件的编码、列/行分隔符、字段类型长度,和两个服务器上数据库A、B的emp表字段兼容,避免后续类型转换、字段截断报错
- 确认包运行所在的服务器能同时连通两个数据库服务器,对应数据库账号拥有emp表的读写、更新权限,提前安装好对应数据库版本的连接驱动(SQL Server优先用OLE DB驱动,其他数据库选对应原生ADO.NET/ODBC驱动即可)
- 如果是增量更新而非全量覆盖,提前确定emp表的唯一匹配键(比如
emp_id),作为更新时的匹配依据
核心包搭建步骤
- 新建单个dtsx包,先在连接管理器区创建3个连接:
- 1个Flat File连接管理器,绑定作为数据源的平面文件,配置好分隔规则、字段数据类型,先预览确认数据读取正常
- 2个数据库连接管理器,分别配置指向数据库A、数据库B的连接信息,测试连通后命名为
DB_A_Conn、DB_B_Conn方便后续区分
- 拖入1个数据流任务到控制流面板,双击进入数据流设计页:
- 首先添加平面文件源组件,绑定之前建好的Flat File连接管理器,确认输出列和源文件字段一一对应,存在类型不匹配的就加一个数据转换组件,提前把字段转成和目标emp表一致的类型
- 根据你的数据更新逻辑二选一配置后续分支:
场景1:全量覆盖/纯新增写入(平面文件是全量emp数据,不需要匹配更新旧记录)
- 直接从平面文件源(或数据转换组件输出端)拖出两个绿色数据流箭头,分别连到两个OLE DB目标组件
- 第一个OLE DB目标绑定
DB_A_Conn,选择目标表为emp,完成源字段和目标表字段的映射,数据访问模式选「表或视图 - 快速加载」提升写入效率 - 第二个OLE DB目标绑定
DB_B_Conn,重复上述字段映射、快速加载配置即可 - 这个模式下平面文件只会被读取一次,通过SSIS的数据流多播能力同时分发给两个目标库,不会产生重复读文件的IO开销,性能很高
场景2:增量upsert(平面文件包含新增+变更数据,需要按主键匹配更新已有记录、插入新记录)
- 在平面文件源之后拖入多播组件,将数据流拆成两个完全独立的分支,分别对应数据库A、数据库B的更新逻辑
- 针对数据库A的分支:添加查找组件,拿数据流里的唯一键(比如
emp_id)去匹配DB_A里emp表的已有记录,匹配成功的分支走更新逻辑,匹配失败的分支走插入逻辑。更新逻辑如果数据量小可以用OLE DB命令组件,写带参数的UPDATE语句比如UPDATE emp SET emp_name=?, dept=?, salary=? WHERE emp_id=?,按顺序映射好输入列和参数即可;插入逻辑直接连绑定DB_A_Conn的OLE DB目标组件 - 针对数据库B的分支,完全复用上述查找+分支处理的逻辑,绑定
DB_B_Conn完成配置即可 - 注意:单批数据量超过10万行时不要用逐行执行的OLE DB命令做更新,性能极差。优先换staging临时表方案:先把平面文件数据批量写入两个库的独立临时staging表,再在控制流的数据流任务之后加两个执行SQL任务,通过MERGE语句或者UPDATE+INSERT的组合SQL,批量完成staging表到正式emp表的更新/新增,性能比逐行更新高两个数量级以上
优化与异常处理
- 给两个目标分支都配置错误输出重定向,把类型不匹配、约束冲突的写入失败行导出到单独的错误日志文件或错误表,不会因为单条脏数据导致整个包执行失败
- 两个数据库连接的
RetainSameConnection属性设为False,避免不必要的长连接占用;快速加载模式下根据服务器内存调整批量插入行数,默认2500行,大文件场景可以调到1万-5万行进一步提升写入速度 - 跨网传输、两个服务器延迟差异大的场景,优先选staging表方案,不要在数据流里做逐行同步更新,避免执行超时
测试阶段先用几十条小批量数据验证,确认两个库的emp表更新、插入结果符合预期后,再跑全量数据;部署时建议把两个数据库的连接字符串配置为包参数,后续换服务器、改账号不需要重新编辑包,直接修改参数即可。
内容的提问来源于stack exchange,提问作者Arjun Singh
相关产品推荐
相关产品推荐

