SSIS中派生列表达式构建及Unicode/非Unicode类型转换问题
问题分析与解决方案
首先,咱们先搞定你遇到的类型转换错误问题——根源出在表达式里的类型不匹配:你写的!ISNULL(PhoneNumber ) ? "Office" : PhoneNumber中,双引号包裹的"Office"默认是SSIS的Unicode字符串类型(DT_WSTR),而你的源列PhoneNumber是varchar(50)对应SSIS的DT_STR类型,两种字符串类型直接混用就会触发那个转换错误。而且你的逻辑其实也写错了:需求是“不为空则设为Office,否则设为NULL”,所以else分支应该是NULL,不是PhoneNumber哦。
正确的派生列表达式写法
你需要统一两边的类型,有两种选择:
1. 保持非Unicode(DT_STR)类型匹配源列
把"Office"转换成DT_STR类型,同时指定代码页(比如常用的1252),else分支返回对应类型的NULL:
!ISNULL(PhoneNumber) ? (DT_STR, 50, 1252)"Office" : NULL(DT_STR, 50, 1252)
2. 统一为Unicode(DT_WSTR)类型
如果后续数据流更偏向Unicode场景,可以把源列转成DT_WSTR,再返回Unicode的"Office":
!ISNULL((DT_WSTR,50)PhoneNumber) ? "Office" : NULL(DT_WSTR,50)
关于修改派生列类型为DT_STR的问题
能不能改?
完全可以在派生列的高级编辑器里,把PhoneNumberType的数据类型从DT_WSTR改成DT_STR——只要你指定正确的长度和代码页(比如长度设为50,代码页1252),就能和源列的varchar(50)类型匹配。
是不是良好实践?
这得看你的整个数据流和目标系统的情况:
- 如果你的源列(
PhoneNumber)是varchar(非Unicode),目标列也是varchar类型,那改成DT_STR是合理的,能避免不必要的Unicode/非Unicode转换,提升性能,也符合数据类型的一致性。 - 如果你的数据流里大部分其他列都是Unicode(
nvarchar/DT_WSTR),或者目标系统要求Unicode,那强行改成DT_STR反而会增加额外的转换开销,甚至可能导致字符丢失(比如非英语字符),这时候就不推荐。
另外要注意:修改类型后,一定要确保表达式里的返回值类型和你设置的派生列类型完全一致,不然还是会触发转换错误。
内容的提问来源于stack exchange,提问作者Ajinkya Pujari
相关产品推荐
相关产品推荐

