我们有一个SSIS包,将数据从Oracle数据库下载到SQL Server数据仓库。对于这个数据仓库,建立了几个环境;开发,测试和生产。开发和测试共享一台机器,Prod是独立的。
当在PROD机器上运行SSIS包时,它会将我们的Oracle源数据库中的Varchar2列以DT_WSTR格式下载到MSSQL,并将其保存到NVarchar列。 I.E.涉及的所有步骤都支持Unicode。
当在DEV / Test框上对同一个源数据库运行同一个包时,它会以某种方式将外部列视为Varchar,将其导出到数据流中的DT_STR并拒绝将其存储在NVarchar列中。 / p>
所有操作系统都是Win2K8r2,MSSQL 2008 64位。该程序包以32位模式运行,从BIDS或SQL Agent运行时可以看到相同的行为。
任何人都在乎为什么要猜?我已经看到了禁用验证外部元数据的建议(https://stackoverflow.com/a/18383598/2903056),但这不是我们情况的实用建议。
答案 0 :(得分:2)
我知道一个老问题,但似乎仍然有用。由于我在过去的3个月内找不到合适的答案,所以我现在认为发布我的研究结果的时间非常好。
我有同样好奇的行为,最终能够解决它。 我的布局看起来像这样:
DEV和TEST都连接到ORA。 DEV将VARCHAR2列报告为DT_WSTR,而TEST则坚持认为它们是DT_STR。
然后我在TEST上安装了ODT 12.1.0.21,问题解决了。值得注意的是,我使用了"机器范围"安装期间的选项。我不确定会产生多大的影响。
Oracle OleDb提供程序在不同版本的客户端组件中返回的数据类型似乎有所不同。
答案 1 :(得分:1)
检查注册表中NLS_LANG的值。
reg query HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_<orahome> /f NLS_LANG
如果它与服务器的字符集匹配,OraOLEDB将使用常规(非Unicode)数据类型DBTYPE_STR,否则它使用Unicode模式,数据类型为DBTYPE_WSTR。
如果缺少NLS_LANG字段,则默认为US7ASCII,几乎肯定不会与您的数据库匹配,您将使用Unicode数据类型。
要获取服务器的字符集,请执行以下操作:
SELECT parameter, value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';
答案 2 :(得分:-1)
如果元数据验证属性值为true,则检查元数据验证属性值