SSIS场景下Oracle NUMBER与SQL Server数据类型映射问题咨询
报错根因
你遇到的0x80131938错误本质是Oracle NUMBER类型与SQL Server FLOAT类型的精度/范围不兼容导致转换失败。Oracle的NUMBER是高精度十进制存储类型,而SQL Server的FLOAT是近似数值类型,对于有精确小数位要求、整数位超过FLOAT可精确存储范围的数值,转换时会触发精度损失或溢出,SSIS源组件配置的「出错时失败」规则就会直接终止包运行。
Oracle NUMBER 到 SQL Server 标准映射规则
根据NUMBER的定义分场景选择目标类型:
- 整数值场景(Oracle端定义为
NUMBER(p)无小数位,p为精度)- p ≤ 9:目标用
INT,范围-231到231-1 - 10 ≤ p ≤ 18:目标用
BIGINT,范围-263到263-1 - p > 18:目标用
DECIMAL(p, 0),最大支持p=38的整数值
- p ≤ 9:目标用
- 带小数的精确数值场景(Oracle端定义为
NUMBER(p,s),s为小数位数,常见于金额、单价类字段,比如你提到的UNIT_PRICE)- 直接对应SQL Server的
DECIMAL(p,s)即可,完全匹配精度不会出现转换损失,这也是单价类字段的最优选择,不要用FLOAT这类近似类型
- 直接对应SQL Server的
- 不确定精度/无显式定义的NUMBER场景(Oracle端仅写
NUMBER没有指定p和s,默认是NUMBER(38,*))- 业务上要求精确存储:用
DECIMAL(38,10)(可根据实际业务可能的小数位数调整s值,最大支持38位总精度) - 业务允许近似数值、数值范围极大:可以用
FLOAT(53)(也就是SQL Server里的双精度FLOAT类型,注意不要用默认的FLOAT,默认是FLOAT(24)单精度,精度更低)
- 业务上要求精确存储:用
SSIS 包配置调整建议
- 打开ADO NET源的高级编辑器,检查输出列的SSIS原生数据类型,对应
UNIT_PRICE这类金额字段要设置为DT_NUMERIC类型,匹配目标端的DECIMAL精度 - 避免全量NUMBER统一映射FLOAT的规则,根据字段业务含义逐列确定映射类型,金额、统计类精确数值必须用十进制精确类型
- 如果仍有偶发转换错误,可以临时把错误行处置改为「重定向到错误输出」,先捕获具体的异常值再调整映射规则
内容的提问来源于stack exchange,提问作者djohnjohn
相关产品推荐
相关产品推荐

