如何在SSIS的Script Component中调整多表数据插入顺序
SSIS Script Component 主表优先插入关联表的配置方案
1. 调整Script Component输出配置
首先将Script Component设置为「转换」类型,新增3个异步输出,所有输出的SynchronousInputID属性需改为None:
- PersonOutput:输出字段为
Name、Age,自增主键Id无需输出,由数据库自动生成 - JobOutput:输出字段为
Job Title、Hourly Pay,自增主键Id无需输出 - PersonJobTempOutput:临时输出,存储Person和Job的业务唯一标识,比如
PersonName、JobTitle,用于后续关联匹配Id
2. 编写组件内部处理逻辑
在ProcessInputRow方法中完成单条源数据的解析分发,同时新增缓存逻辑避免主表重复插入:
- 初始化两个Dictionary分别缓存已处理的Person、Job唯一标识,重复数据不再往主表输出追加行
- 每解析一行源数据,同时向3个输出追加行:主表输出填对应业务字段,临时输出填Person、Job的唯一匹配字段
3. 配置任务执行顺序(推荐方案,支持大数据量)
因为SSIS同一数据流内多输出为并行执行,无法保证主表插入完成后再插关联表,需拆分任务控制顺序:
- 第一个数据流任务:
- Script Component的PersonOutput连接OLE DB目标,写入Person表
- Script Component的JobOutput连接OLE DB目标,写入Job表
- Script Component的PersonJobTempOutput连接OLE DB目标,写入临时表
TempPersonJobMapping
- 控制流中在第一个数据流任务后新增第二个数据流任务:
- 数据源分别取Person表(
Id、Name)、Job表(Id、Job Title)、临时表TempPersonJobMapping - 通过查找/合并联接操作,将临时表的
PersonName匹配Person表拿到PersonId,JobTitle匹配Job表拿到JobId - 匹配完成后的结果直接插入PersonJob关联表即可
- 数据源分别取Person表(
4. 小数据量简化方案
如果数据量在万行以下,也可以直接在Script内部通过ADO.NET操作数据库:
- 先批量插入去重后的所有Person、Job记录
- 调用查询拿到新增记录的
Id映射关系 - 最后批量组装PersonJob关联记录插入数据库
该方案无法利用SSIS原生批量插入优化,大数据量下性能差距明显
内容的提问来源于stack exchange,提问作者nightmare637
相关产品推荐
相关产品推荐

