首页 > 解决方案 > 如何在 SSIS for Oracle 源中默认将 DT_STR 更改为 DT_WSTR

问题描述

我们的虚拟机上有一个 SSIS 包(假设它是 VM1),我们从 Oracle 源中提取数据。Oracle 中该列的数据类型是 Varchar2,而在 SSIS 中,它作为 DT_WSTR 数据类型提取并将数据存储为 NVarchar 列。当我从不同的虚拟机打开相同的包时(假设这是 VM2),SSIS 包被拉为 DT_STR 数据类型,并且由于 SSIS 包验证阶段的转换错误,包失败。当我单击 Oracle 源 SSIS 包的数据流任务中的列时,我还会收到一条警告,该警告粘贴在下面。

警告 - 无法从 OLE DB 提供程序检索列代码页信息。如果组件支持“DefaultCodePage”属性,则将使用该属性的代码页。如果当前字符串代码页值不正确,请更改属性值。如果组件不支持该属性,则将使用组件区域设置 ID 中的代码页。

我们在 VM1 和 VM2 上都安装了 Oracle Java(JDK) 和 Oracle 客户端。我们 VM 上的操作系统是 Windows 7,SSIS 包在两个 VM 上都是 Visual Studio 2013。

标签: sql-serveroraclessis

解决方案


我不得不处理 Oracle 和 SSIS 之间的类似数据类型问题。由于 SSIS 对数据类型如此挑剔,我不得不找到在 Oracle 端实施的解决方案。

在我解释我的答案之前,我应该提到我使用 Microsoft 的 Attunity Connectors for Oracle。我强烈建议在 Microsoft 和 Oracle 提供的默认连接上使用这些连接器。

因此,话虽如此,我发现了两种似乎可以在正确编码中提取数据的技术。SSIS 在从 Oracle 系统读取和翻译元数据方面确实很糟糕,但是显式转换为 VARCHAR2,即使该列已经是 VARCHAR2,似乎足以暗示 SSIS 知道该列将是 DT_STR 类型。在我所有的 Oracle Source 任务中,我使用 SQL 命令而不是仅仅选择表(这是最佳实践),这允许我将 CAST 添加到查询中。对于 VARCHAR2 列,我会做这样的事情:

SELECT CAST("PO Number" AS VARCHAR2(30)) AS "PONumber" FROM TABLE1

这通常就足够了。但有时不会,因为 Oracle 允许在 VARCHAR2 列中使用一些奇怪的字符。如果[Oracle Source [2345]] Error: OCI error encountered. ORA-29275: partial multibyte character即使在将列显式转换为 VARCHAR2 之后仍看到错误,这是由于代码页不匹配造成的。要更正它,您可以像这样转换字符串的字符编码:

SELECT CONVERT("PO Number",'AL32UTF8','WE8MSWIN1252') AS "PONumber" FROM TABLE1

AL32UTF8是 Oracle 使用的默认 (Unicode) 编码,WE8MSWIN1252也是 Windows 系统使用的默认 (ASCII 1252) 编码。


推荐阅读