我有一个SSIS包,它可以在不同的服务器上完美地工作,但在2个新添加的服务器上不能。它使用OLEDB (64位,我已经认证)从包含3个VARCHAR2列的表中获取数据,并将这些行插入到包含3个相同大小的nvarchar列的SQL2012表中。
这个包在我们部署的所有服务器上都能完美地工作。我们最近添加了两台新的服务器,希望(我亲自检查了可能的主要罪魁祸首: 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 server读取代码页”,所以我尝试将“每次都使用默认代码页”与美国国家标准协会或UTF-8代码页结合使用(使用此网站获取代码页:https://msdn.microsoft.com/en-us/library/windows/desktop/dd317756%28v=vs.85%29.aspx )。
我让它工作的唯一方法是通过将外部列更改为ansi字符串,使其在开发环境中不可编译,手动将OLE DB源块修改到包中,然后再次将外部列更改为utf-8字符串的数据转换。这种方式在其他服务器上不起作用,但在“有故障”的服务器上却可以完美地工作。
我在想,包不能从Oracle服务器读取代码页是罪魁祸首,但我不知道如何解决这个问题。
这个问题并不像你在任何地方都能找到的关于这个问题的数百万个问题。给出的错误来自OLE DB源代码块。我知道数据转换的事。
提前感谢
发布于 2016-09-02 16:13:13
问题出在NLS_LANG注册表项的值,它设置为不正确的值。我通过删除上述密钥解决了问题,一切工作正常。
发布于 2019-01-30 22:23:25
只要读到这篇文章(以及其他许多关于这个问题的文章),相信我已经找到了根本原因。至少在我的服务器上,64位版本的Windows Oracle驱动程序在安装过程中有一个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“。我只是在上面的分支中创建了一个字符串的副本。
我希望这对其他人有帮助。
发布于 2021-02-17 00:35:08
我们将32位SSIS与Oracle instant client配合使用,我需要在此注册位置添加条目
"Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE\KEY_OraClient12Home1_32bit"“NLS_LANG”值为“AMERICAN_AMERICA.WE8MSWIN1252”。这解决了我的问题。
https://stackoverflow.com/questions/39159968
复制相似问题