SSIS将Varchar2转换为DT_STR

时间:2013-10-21 12:56:08

标签: oracle unicode ssis

我们有一个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),但这不是我们情况的实用建议。

3 个答案:

答案 0 :(得分:2)

我知道一个老问题,但似乎仍然有用。由于我在过去的3个月内找不到合适的答案,所以我现在认为发布我的研究结果的时间非常好。

我有同样好奇的行为,最终能够解决它。 我的布局看起来像这样:

  • Windows 2003 Server上的Oracle 10g R2数据库(我们称之为ORA)
  • 使用Windows 8,Visual Studio 2012 + SSDT,Sql Express 2012开发机器, ODT 12.1.0.21(让我们称之为DEV)
  • Windows 2012 Server上的Sql Server 2012,Oracle Client 11.2(让我们称之为TEST)

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,则检查元数据验证属性值

相关问题