【问题标题】:SSIS converts Varchar2 to DT_STRSSIS 将 Varchar2 转换为 DT_STR
【发布时间】:2013-10-29 23:35:19
【问题描述】:

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

【问题讨论】:

  • 尝试文本,而不是 DT_STR
  • 很抱歉,更改包的内容不是一个选项(此时)。我相信如果一个盒子能正确地做到这一点,另一个也可以。只是这个问题在很多包中都出现了......
  • 每个环境的 Oracle 源代码是否相同?比较您的 SQL Server 语言环境/排序规则?
  • 是的,在这两种情况下,Oracle 源都是同一台服务器上的同一个数据库。 SQL Server 具有相同的排序规则和区域设置;唯一的例外是我们的 PROD 机器上的Locaton 设置。这设置为美国,DEV 设置为荷兰。我已手动编辑注册表以将所有 NLS_LANGUAGE 键设置为 AMERICAN。
  • 当您查看源转换的输出列的高级属性时,指定输出为 varchar2 列的 SSIS 数据类型是什么?您是否仔细检查以确保它在两种环境中都相同?

标签: oracle unicode ssis


【解决方案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';

【讨论】:

  • HKLM\SOFTWARE\Wow6432Node\Oracle\Key_orahome
  • Oracle 选择报告“WE8MSWIN1252”。注册表报告“AMERICAN_AMERICA.WE8MSWIN1252”。我想这些是一样的吗?不确定。
【解决方案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 提供程序返回的数据类型似乎有所不同。

【讨论】:

  • 我一定会试试这个的!
【解决方案3】:

检查元数据验证属性值,如果为真,则为假

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    相关资源
    最近更新 更多