SSIS派生列用表达式将空白值转NULL时出现Unicode类型问题如何解决
问题成因
- SSIS表达式引擎的三元运算符(
? :)存在类型自动推断规则:当两个分支的返回值存在隐式转换路径时,引擎会默认选择覆盖范围更大的类型作为整个表达式的返回类型。 - 即使你显式将NULL值声明为
DT_STR类型,多数版本的SSIS表达式引擎在计算三元表达式时,仍会将NULL值默认识别为Unicode字符串(DT_WSTR)类型,进而将整个表达式的返回值隐式升级为DT_WSTR,忽略你在分支内的显式类型声明。
修复方案
方案1:外层强制类型转换(最快修复)
给整个三元表达式套一层外层的DT_STR显式转换,直接覆盖SSIS的自动类型推断结果,修改后的表达式如下:
(DT_STR,3,1252)( TRIM((DT_STR,3,1252)SUBSTRING([RowData],1046,3)) == "" ? NULL(DT_STR,3,1252) : SUBSTRING([RowData],1046,3) )
修改完成后可以在派生列编辑器中鼠标悬停在表达式上,确认返回类型显示为DT_STR即可。
方案2:拆分处理逻辑(兼容性最好)
如果外层强制转换仍存在兼容性问题,可以拆分逻辑避免三元运算符的类型推断问题:
- 先新增一个临时派生列
ExtractedField,类型设置为DT_STR,3,1252,表达式为:TRIM((DT_STR,3,1252)SUBSTRING([RowData],1046,3)) - 再新增一个派生列,判断
ExtractedField是否为空字符串,为空则返回NULL(DT_STR,3,1252),否则返回ExtractedField,此时单分支赋值不会触发类型自动升级。
内容的提问来源于stack exchange,提问作者Zach Lau
相关产品推荐
相关产品推荐

