SSIS无法在Unicode和非Unicode之间进行转换。

3
我有一个SSIS包,在多个服务器上运行良好,但在两个新添加的服务器上却无法正常工作。它使用OLEDB(64位,我已经验证过)从一个拥有3个VARCHAR2列的ORACLE数据库中获取数据,并将行插入到具有相同大小的3个nvarchar列的SQL 2012表中。
该包在我们部署的所有服务器上都能完美运行。最近我们添加了两台新服务器,它们应该使用相同版本的软件(我个人检查了可能的主要原因:ODAC、dtexec版本和tns名称),但该包不再工作。它给出了著名的错误提示:
   Description: Column "C_CODE" cannot convert between unicode and non-unicode s
tring data types.
End Error
Error: 2016-08-26 08:33:26.20
   Code: 0xC02020F6
   Source: Upsert Lines OLE DB Source [87]
   Description: Column "S_DESC" cannot convert between unicode and non-unicode s
tring data types.
End Error
Warning: 2016-08-26 08:33:26.20
   Code: 0x800470C8
   Source: Upsert Lines OLE DB Source [87]
   Description: The external columns for OLE DB Source are out of synchronizatio
n with the data source columns. The external column "C_CODE" needs to be updated
.
The external column "S_DESC" needs to be updated.
End Warning

我收到的第一个警告是“无法从Oracle服务器读取代码页”,因此我尝试将“每次使用默认值”与ANSI或UTF-8代码页结合使用(使用此网站获取代码页:https://msdn.microsoft.com/en-us/library/windows/desktop/dd317756%28v=vs.85%29.aspx)。
唯一让我成功的方法是手动修改包中的OLE DB源块,将外部列更改为ansi字符串,使其在开发环境中无法编译,然后放置一个数据转换器,将外部列再次更改为utf-8字符串。这样在其他服务器上无法正常工作,但在“有故障”的服务器上完美运行。
我认为问题不像您可以在任何地方找到的关于此问题的数百万个问题那样。给出错误的是OLE DB源块。我了解数据转换。
提前致谢。

1
我在使用Attunity Connector for Oracle(ConnectionManagerType = MSORA)时从未遇到过这个错误。你试过吗?SSIS 2014:https://www.microsoft.com/en-us/download/details.aspx?id=44582 SSIS 2012:https://www.microsoft.com/en-us/download/details.aspx?id=29283。 希望对你有所帮助。 - vercelli
1
在我的开发环境中,Attunity发现列的代码页是ANSI(1252),而OLEDB使用代码页0,并假设它们是UTF。 - Massimo
看起来很有希望,对吗? - vercelli
1
是的,这些驱动程序看起来更适合SSIS。我一定会进行深度测试的 :) - Massimo
1
似乎新机器上没有设置NLS_LANG注册表键,导致系统管理员需要修复安装并重新检查(工作中的安装中的NLS_LANG设置为1252代码页)。 - Massimo
显示剩余4条评论
3个回答

1
问题出在NLS_LANG注册表键的值上,它被设置为了不正确的值。 我通过删除该键来解决问题,一切都正常工作了。

1
我刚看到这篇文章(和其他关于此问题的文章),并相信我已经找到了潜在的原因。至少在我的服务器上,Windows Oracle 64位驱动程序安装过程中存在一个 bug。我已经检查了32位版本,这个 bug 并不存在,这解释了这种行为。
似乎64位版本在错误位置创建了 NLS_LANG 注册表键。默认情况下,64位驱动程序将其创建在“HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE”这里。
我手动将其创建在“HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient12Home1”,这解决了我的问题。供参考,我的 NLS_LANG 键设置为“ENGLISH_UNITED KINGDOM.WE8MSWIN1252”。我只是将其作为上面分支中的字符串副本创建。
希望这可以帮助其他人。

0
我们使用32位的SSIS与Oracle即时客户端,我需要在这个注册位置添加条目。
"Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE\KEY_OraClient12Home1_32bit"

“NLS_LANG”

的值是“AMERICAN_AMERICA.WE8MSWIN1252”。这解决了我的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接