如何在SSIS中基于XML文件移除合并后数据的指定行?
在SSIS中基于XML排除列表过滤数据的方案
最优方案:使用Lookup组件
因为你需要基于多列匹配(SupplierName、Entity、ExpenseArea)移除指定行,Lookup组件是最直接高效的选择,尤其适合80行规模的排除列表:
- 确认XML导入的排除数据集已正确加载,三个关键列(SupplierName、Entity、ExpenseArea)的数据类型、编码与UnionAll输出的主数据集完全一致。
- 将主数据集接入Lookup组件,配置Lookup连接到XML排除数据集,设置匹配条件为三个列完全相等:
主.SupplierName == 排除.SupplierName主.Entity == 排除.Entity主.ExpenseArea == 排除.ExpenseArea
- 切换Lookup的输出模式为**“将不匹配的行发送到输出”**——这部分就是需要保留的有效数据;匹配到的行(即需要移除的)可直接丢弃,或发送到日志/错误输出用于审计。
用Conditional Split实现的方法(不推荐,仅作参考)
Conditional Split更适合简单单条件过滤,多列多值匹配需要额外处理:
- 先给主数据集和排除数据集生成拼接键:用派生列组件,将三个列用一个不会出现在数据中的特殊字符拼接,比如:
SupplierName + "|||" + Entity + "|||" + ExpenseArea - 将排除数据集的拼接键加载到一个字符串变量
@[User::ExcludeKeys]中,用分号分隔所有键(可通过执行SQL任务或脚本任务实现)。 - 在Conditional Split中设置判断条件:
满足条件的行保留,否则丢弃。FINDSTRING(@[User::ExcludeKeys], 派生的拼接键, 1) == 0
注意:这种方法容易因数据中包含分隔符导致匹配错误,且变量长度需足够容纳80个拼接键的总长度。
其他替代方案
数据库端过滤
如果主数据和排除数据都能加载到数据库临时表,直接用SQL语句过滤更简单:
-- 保留不在排除列表中的数据 SELECT * FROM 主临时表 WHERE NOT EXISTS ( SELECT 1 FROM 排除临时表 WHERE 主临时表.SupplierName = 排除临时表.SupplierName AND 主临时表.Entity = 排除临时表.Entity AND 主临时表.ExpenseArea = 排除临时表.ExpenseArea )
这种方式适合大数据量,数据库查询优化器会处理匹配逻辑,效率更高。
脚本组件实现
用C#/VB脚本组件加载排除列表到哈希集合,逐行判断:
- 在脚本组件的
PreExecute方法中,读取XML排除数据集的三个列,将其组合成元组或拼接字符串存入哈希集合。 - 在
ProcessInputRow方法中,判断当前行的三个列是否存在于哈希集合中,不存在则输出该行。
注意事项
- 确保匹配列的数据类型完全一致,避免因长度、编码差异导致匹配失败。
- 若需忽略大小写,统一将所有匹配列转换为大写(或小写)后再进行匹配。
- 处理空值:若列可能为空,需在匹配条件中添加空值判断,比如
ISNULL(主列) == ISNULL(排除列) AND (主列 == 排除列 OR ISNULL(主列))。
内容的提问来源于stack exchange,提问作者Reeds Official
相关产品推荐
相关产品推荐

