SSIS运行报错:Unicode与非Unicode字符串类型无法转换求助
兄弟,我之前也踩过这个一模一样的坑——明明两边都配置成DT_WSTR了,还是弹出那个烦人的转换错误。结合我的实操经验,你可以从这几个方向排查解决:
先确认SQL目标表的物理列类型
别光看SSIS里的输入列类型,去SQL Server里查目标表的实际列:如果目标列是varchar(非Unicode),哪怕SSIS里把输入设成DT_WSTR,SSIS后台还是会自动尝试把Unicode转成非Unicode,直接触发错误。解决方法很简单:把目标列改成nvarchar类型(如果业务需要存储Unicode字符的话),或者如果不需要Unicode,就把SSIS里的列统一改成DT_STR。刷新SSIS的元数据缓存
SSIS有时候会缓存旧的元数据,哪怕你后来改了类型,它还是按旧的来。试试这几步:- 右键点击Oracle源组件,选择「刷新」;
- 如果刷新没用,就删掉源组件重新添加,再重新做列映射;
- 也可以右键点击数据流向任务,选择「验证」,让SSIS重新校验所有元数据。
检查数据流向中的中间组件
看看源和目标之间有没有派生列、查找、聚合这类组件,是不是在这些组件里不小心改了数据类型?比如在派生列里用了非Unicode的字符串函数,导致列类型偷偷变成DT_STR了。逐一检查这些组件的输出列类型,确保全程都是DT_WSTR。核对Oracle源的底层数据类型与NLS设置
Oracle里的VARCHAR2默认是非Unicode的,NVARCHAR2才是Unicode类型。如果你的Oracle源列是VARCHAR2,哪怕SSIS识别成DT_WSTR,底层读取时还是可能有编码冲突。另外检查Oracle客户端的NLS_LANG环境变量,把它设置成支持Unicode的编码,比如AMERICAN_AMERICA.AL32UTF8,避免编码转换时出问题。显式添加数据转换组件兜底
如果上面的方法都试了还是不行,那就直接在源和目标之间加一个「数据转换」组件,把所有需要转换的列显式地从当前类型转成DT_WSTR(哪怕看起来已经是了)。有时候这种强制转换能解决SSIS内部隐性的类型不匹配问题。
内容的提问来源于stack exchange,提问作者user9245800

