SSIS中如何比较Unicode Text长文本字段?条件拆分尝试失败求助
SSIS中比较两个Unicode长文本字段的解决方法
直接用条件拆分表达式失败的原因:SSIS的表达式引擎不支持直接比较**ntext/nvarchar(max)**这类长文本类型,所以
Text1 != Text2 ? True:False这类写法会报错。方法一:用脚本组件实现比较
- 添加一个「转换」类型的脚本组件,把需要比较的
Text1和Text2设为输入列 - 在脚本编辑器里新增一个布尔型的输出列(比如命名为
IsTextDifferent) - 编写C#代码完成比较(要处理NULL值避免异常):
public override void Input0_ProcessInputRow(Input0Buffer Row) { bool isDifferent = false; if (Row.Text1_IsNull && Row.Text2_IsNull) { isDifferent = false; } else if (Row.Text1_IsNull || Row.Text2_IsNull) { isDifferent = true; } else { isDifferent = !string.Equals(Row.Text1, Row.Text2, StringComparison.Ordinal); } Row.IsTextDifferent = isDifferent; } - 用这个输出的
IsTextDifferent字段作为条件拆分的判断依据
- 添加一个「转换」类型的脚本组件,把需要比较的
方法二:数据源端SQL预处理(适用于SQL Server数据源)
在提取数据的SQL语句里直接计算差异标记,把结果带入SSIS:SELECT Text1, Text2, CASE WHEN Text1 IS NULL AND Text2 IS NULL THEN 0 WHEN Text1 IS NULL OR Text2 IS NULL THEN 1 WHEN Text1 <> Text2 THEN 1 ELSE 0 END AS IsTextDifferent FROM YourTable之后直接用
IsTextDifferent字段做条件拆分即可注意事项
- 必须处理NULL值,否则会出现不符合预期的比较结果
- 如果文本极大,可考虑用
CHECKSUM或BINARY_CHECKSUM做快速哈希比较,但要注意存在极小的哈希冲突概率,适合对性能要求高的场景
内容的提问来源于stack exchange,提问作者Gareth Leonard
相关产品推荐
相关产品推荐

