SSIS如何使用Derived Column动态添加源数据中不存在的列
解决方案
下面是两种可直接落地的实现方案:
方案1:动态生成查询语句(推荐,性能最好、维护成本最低)
你之前尝试的变量存查询的思路是可行的,按以下步骤配置即可:
- 先创建3个包级变量:
v_CurrentSourceConn:存储For Each Loop遍历到的当前源连接字符串v_HasMissingColumns:布尔类型,标记当前源是否缺失目标列v_Query:字符串类型,存储最终执行的查询语句
- 在For Each Loop容器内、数据流任务前,添加一个脚本任务,配置只读变量为
v_CurrentSourceConn,可写变量为v_HasMissingColumns、v_Query,脚本内逻辑如下:- 连接当前源数据库,执行元数据查询判断是否存在缺失列,示例SQL:
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'Sales' AND TABLE_NAME = 'Product' AND COLUMN_NAME = 'ProductSubcategoryID'- 若返回值为1说明列存在,给
v_Query赋值新版源的查询语句;若返回为0,赋值旧版源带NULL AS 缺失列的查询语句
- 数据流任务的OLE DB源配置为**“SQL命令来自变量”**,选择变量
v_Query - 关键配置:将数据流任务、OLE DB源的
DelayValidation属性都设为True,避免设计时元数据验证报错
方案2:使用脚本组件实现动态列补全(适合不想维护多套查询的场景)
如果不想维护两套查询语句,可以直接用脚本组件替换原有的OLE DB源+Derived Column组合:
- 数据流中删除原有OLE DB源,添加脚本组件(类型为源)
- 双击打开脚本组件编辑器,在“输入和输出”页,按目标表结构添加所有需要输出的列,配置对应的数据类型、长度
- 在“脚本”页,添加只读变量
v_CurrentSourceConn,点击“编辑脚本”,在CreateNewOutputRows方法中实现逻辑:- 连接当前源,查询
SELECT * FROM Sales.Product获取数据 - 遍历每行数据时,对每个目标列先判断源中是否存在该列:存在则取源列的值,不存在则赋值
DBNull.Value - 将行添加到输出缓冲区
- 连接当前源,查询
注意:两种方案的输出元数据都完全统一,后续不需要额外调整数据流转逻辑,可直接映射到目标表。
内容的提问来源于stack exchange,提问作者L3LYZA
相关产品推荐
相关产品推荐

