4

我们有一个 SSIS 包将数据从 Oracle 数据库下载到 SQL Server 数据仓库。对于这个数据仓库,设置了几个环境;开发、测试和生产。开发和测试共用一台机器,Prod 是独立的。

当 SSIS 包在 PROD 机器上运行时,它将 Varchar2 列从我们的 Oracle 源数据库以 DT_WSTR 格式下载到 MSSQL,并将其保存到 NVarchar 列。IE涉及的所有步骤都支持Unicode。

当针对 DEV/Test 框上的相同源数据库运行相同的包时,它以某种方式将外部列视为 Varchar,将其派生到数据流中的 DT_STR 并拒绝将其存储在 NVarchar 列中。

所有操作系统都是 Win2K8r2、MSSQL 2008 64 位。该包在 32 位模式下运行,从 BIDS 或 SQL 代理运行时会看到相同的行为。

有人想知道为什么吗?我已经看到了禁用验证外部元数据的建议 ( https://stackoverflow.com/a/18383598/2903056 ),但这对我们的情况来说不是一个实用的建议。

4

3 回答 3

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 提供程序在客户端组件的不同版本中返回的数据类型似乎有所不同。

于 2017-05-05T13:51:06.017 回答
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';
于 2017-09-06T01:10:49.383 回答
-1

检查元数据验证属性值是否为真,使其为假

于 2015-07-02T18:10:35.610 回答