为何SSIS OLE DB源任务中同一数据库列在不同机器的unicode/非unicode识别不一致
SSIS Oracle拉取数据Unicode转换报错本地适配方案
问题根因
报错核心原因是本地Oracle OLE DB驱动将Oracle端非Unicode字符串类型(如VARCHAR2)识别为SSIS的Unicode类型DT_WSTR,而生产环境驱动识别为非Unicode类型DT_STR,和SQL Server目标列类型匹配因此无需额外转换。
解决步骤
- 第一步:清理并重装匹配版本的Oracle客户端
完全卸载本地所有已安装的Oracle客户端,删除残留注册表项、Oracle相关环境变量后,安装和生产服务器**完全同版本、同架构(32/64位)**的Oracle客户端,避免多版本混装导致驱动优先级混乱。 - 第二步:统一NLS_LANG配置
- 先执行SQL查询生产Oracle数据库的字符集:
select * from nls_database_parameters where parameter='NLS_CHARACTERSET'; - 保证本地以下三处NLS_LANG配置值完全一致,且字符集部分和数据库查询结果匹配:
- 系统环境变量中的NLS_LANG
- 64位客户端对应注册表路径:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\下对应Home项的NLS_LANG值 - 32位客户端安装在64位系统时,对应注册表路径:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE\下对应Home项的NLS_LANG值
配置完成后重启设备生效。
- 先执行SQL查询生产Oracle数据库的字符集:
- 第三步:匹配SSIS运行架构
本地SSDT调试时,右键SSIS项目→【属性】→【调试】,将Run64BitRuntime参数调整为和生产服务器SSIS运行时一致的架构(生产用64位则开启,32位则关闭)。 - 第四步:校验OLE DB源列类型
打开OLE DB源的高级编辑器,进入【输入和输出属性】页,手动将外部字符串列的类型从DT_WSTR调整为和生产一致的DT_STR,匹配目标SQL Server列的长度、代码页即可。
内容的提问来源于stack exchange,提问作者Kelly
相关产品推荐
相关产品推荐

