使用Attunity连接器从Oracle同步至SQL Server遇SSIS转换错误求排查
我在用Attunity Oracle连接器将Oracle表数据同步到SQL Server时遇到以下错误:
Error: 0x27B at PROJECT_COST_HISTORY oracleSource 1, Oracle Source [331]: A conversion error occurred. Column name is 'PERIOD_NAME'. Error: 0xC0047038 at PROJECT_COST_HISTORY oracleSource 1, SSIS.Pipeline: SSIS Error Code DTS_E_PRIMEOUTPUTFAILED. The PrimeOutput method on Oracle Source returned error code 0x80004005. The component returned a failure code when the pipeline engine called PrimeOutput(). The meaning of the failure code is defined by the component, but the error is fatal and the pipeline stopped executing. There may be error messages posted before this with more information about the failure.
但实际问题似乎不是标记的PERIOD_NAME列:单独只同步该列时,插入操作完全正常。Oracle中该列的数据示例为:
- MAY-FY2021
- NOV-FY2018
- APR-FY2017
- SEP-FY2019
我已经检查过该列数据,没有异常。
场景补充
- 从Oracle源同步约60个不同数据类型的列,通过转换组件将它们转为SQL Server兼容类型:
- database timestamp with precision [DT_DBTIMESTAMP2]
- double precision
- float [DT_R8]
- numeric [DT_NUMERIC]
- unicode string [DT_WSTR]
- 移除转换组件和OLEDB Destination后,包部署到SQL Server可以正常运行,说明Oracle读取环节没有问题;但保留转换和目标组件时就会触发上述转换错误。
- 我之前用C#控制台程序(通过SqlBulkCopy和数据读取器)完成过同步,但速度极慢。
- SQL Server的目标表是通过以下语句创建的:
select * into TABLE from openquery('alias', 'select * from table where rownum < 2')
请问还有哪些有效的调试方法?
调试方法建议
逐列排查转换逻辑
既然单独同步PERIOD_NAME正常,说明问题出在多列组合时的转换冲突。可以尝试分批保留列:先保留10列(包含PERIOD_NAME)同步,若正常则逐步增加列,直到触发错误,定位到真正出问题的列。检查转换组件的映射细节
- 确认每列的转换规则是否匹配:比如Oracle中的数值类型精度是否超过SQL Server目标列的定义,字符串列的长度是否超出
DT_WSTR的设置上限。 - 开启转换组件的错误输出,将转换失败的行导向临时表或文件,直接查看具体哪一行、哪个字段触发了转换错误。
- 确认每列的转换规则是否匹配:比如Oracle中的数值类型精度是否超过SQL Server目标列的定义,字符串列的长度是否超出
验证SQL Server目标表结构
用openquery生成的表可能存在类型不匹配的问题:比如Oracle的VARCHAR2转为SQL Server的NVARCHAR时长度是否一致,日期类型的精度是否兼容。可以对比Oracle源表和SQL Server目标表的每列类型、长度、精度,手动修正目标表的结构。启用SSIS详细日志
在SSIS包中启用更详细的日志记录,勾选PipelineComponent相关的日志事件,查看转换过程中的详细报错信息,可能会暴露隐藏的类型转换冲突。替换转换逻辑测试
尝试用Data Conversion组件替换当前的转换逻辑,或者直接在Oracle源查询中提前做类型转换(比如用TO_CHAR、TO_DATE处理字段),绕过SSIS的转换环节,看是否还会报错。检查Attunity连接器版本
确认使用的Attunity Oracle连接器版本是否兼容当前的Oracle和SQL Server版本,旧版本可能存在某些类型转换的bug,尝试升级到最新稳定版。
内容的提问来源于stack exchange,提问作者Baldie47

