我们的虚拟机(假设为 VM1)上有一个 SSIS 包,我们从 Oracle 源中提取数据。 Oracle 中该列的数据类型是 Varchar2,在 SSIS 中,它以 DT_WSTR 数据类型提取并将数据存储为 NVarchar 列。
当我从不同的虚拟机(假设为 VM2)打开相同的包时,SSIS 包将作为 DT_STR 数据类型拉取,并且由于 SSIS 包的验证阶段中的转换错误,该包失败。当我单击 Oracle 源 SSIS 包的数据流任务中的列时,我还收到粘贴在下面的警告。
警告 - 无法从 OLE DB 检索列代码页信息
提供者。如果组件支持“DefaultCodePage”属性,
将使用该属性的代码页。改变值
如果当前字符串代码页值不正确,则该属性。如果
该组件不支持该属性,代码页来自
将使用组件的区域设置 ID。
我们在 VM1 和 VM2 上安装了 Oracle Java(JDK) 和 Oracle 客户端。
我们的虚拟机上的操作系统是 Windows 7,两个虚拟机上的 SSIS 包都是 Visual Studio 2013。
我不得不处理 Oracle 和 SSIS 之间类似的数据类型问题。由于 SSIS 对数据类型如此挑剔,我必须找到一个在 Oracle 端实现的解决方案。
在解释我的答案之前,我应该提到我使用 Microsoft 的 Attunity Connectors for Oracle。我强烈建议使用这些连接器而不是 Microsoft 和 Oracle 提供的默认连接。
因此,话虽如此,我发现了两种似乎可以以正确的编码方式提取数据的技术。 SSIS 确实不擅长从 Oracle 系统读取和转换元数据,但显式转换为 VARCHAR2,即使该列已经是 VARCHAR2,似乎足以暗示 SSIS 知道该列将是 DT_STR 类型。在我的所有 Oracle Source 任务中,我使用 SQL 命令而不仅仅是选择表(这是最佳实践 https://learn.microsoft.com/en-us/archive/blogs/sqlcat/top-10-sql-server-integration-services-best-practices),这允许我将 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) 编码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)