SQL导入向导无法映射Oracle数据类型139的技术求助
通过Oracle Provider for OLE DB将Oracle表导入SQL Server时,遇到源列类型为139的转换问题。预览数据都是数字(如'93'、'1006'、'313176'),尝试映射到INT、FLOAT、NUMERIC、VARCHAR均失败,报错显示SSIS无法识别该类型,转换步骤提示“转换未知”。
报错详情:
[源信息] 源提供程序: OraOLEDB.Oracle.1 列类型:139 SSIS类型: (未知类型...) 映射文件(至SSIS类型):C:\Program Files (x86)\Microsoft SQL Server Management Studio 19\Common7\IDE\CommonExtensions\Microsoft\SSIS\160\MappingFiles\OracleToSSIS10.XML
[目标信息] 目标提供程序: SQLNCLI11 列类型: int SSIS类型: 四字节有符号整数 [DT_I4] 映射文件(至SSIS类型): C:\Program Files (x86)\Microsoft SQL Server Management Studio 19\Common7\IDE\CommonExtensions\Microsoft\SSIS\160\MappingFiles\MSSQLToSSIS10.XML
[转换步骤] 转换未知... SSIS转换文件:C:\Program Files (x86)\Microsoft SQL Server Management Studio 19\Common7\IDE\CommonExtensions\Microsoft\SSIS\160\binn\DtwTypeConversion.xml
解决办法
确认Oracle字段的真实类型
Oracle类型代码139对应CHAR(固定长度字符),可能是字符集或字段属性导致SSIS识别异常。在Oracle端执行以下查询确认字段详情:SELECT data_type, data_length, char_used FROM all_tab_columns WHERE table_name = '你的目标表名' AND column_name = '出问题的列名';修改SSIS类型映射文件
找到报错里的OracleToSSIS10.XML文件,编辑它,在<DataTypeMappings>节点内添加类型139到SSIS字符串类型的映射:<DataTypeMapping> <SourceDataType> <DataTypeName>139</DataTypeName> </SourceDataType> <DestinationDataType> <SSISDataType>DT_STR</SSISDataType> <Length>填写字段实际长度</Length> </DestinationDataType> </DataTypeMapping>保存文件后重启SSMS,再尝试导入操作。
用SQL查询显式转换字段类型
不直接选择Oracle表,而是写SQL语句把问题列转换为SSIS可识别的类型,比如:-- 转换为数字类型 SELECT CAST(问题列名 AS NUMBER) AS 问题列名 FROM 你的表名; -- 或者转换为字符类型 SELECT TO_CHAR(问题列名) AS 问题列名 FROM 你的表名;之后将转换后的列映射到SQL Server的对应类型即可。
更换Oracle数据提供程序
如果OLEDB Provider兼容性不佳,试试改用ODBC Driver for Oracle或Oracle Data Provider for .NET (ODP.NET)作为数据源,这些工具对Oracle类型的识别更准确。
内容的提问来源于stack exchange,提问作者kaspar

