使用SSIS从Oracle迁移数据到SQL Server的小数点问题
解决思路
- 检查目标端数据类型映射:打开OLE DB目标组件的映射界面,确认Oracle NUMBER列对应的SQL Server列确实是Float类型,没有被自动映射成
INT/BIGINT等整数类型。有时候SSIS会根据源数据的部分样本误判类型,手动修正映射即可。 - 修正ADO NET源的输出列类型:在ADO NET源的高级编辑器中,查看输出列的数据类型。如果Oracle NUMBER列被识别为整数类型(如
DT_I4),手动修改为带小数的类型(如DT_DECIMAL,设置小数位为8),再映射到目标Float列。 - 用派生列组件强制转换:替换源查询的Round函数,改用派生列组件编写表达式
ROUND(YourOracleColumn, 8),并将派生列的数据类型设置为**DT_R8**(对应SQL Server Float类型),再将该列映射到目标表的Float列,通过强制指定输出类型避免小数丢失。 - 验证目标表的Float列定义:检查SQL Server目标表的DDL,确认Float列是
FLOAT或FLOAT(53)(默认配置),而非被错误设置为FLOAT(0)这类会导致精度丢失的配置。 - 更换目标端连接方式:尝试将OLE DB目标换成ADO NET连接SQL Server,部分场景下OLE DB对Float类型的转换存在兼容性问题,ADO NET的类型映射逻辑更准确。
- 启用SSIS日志排查:开启包的详细日志(勾选“数据转换”相关事件),查看数据写入目标时的实际值和转换过程,定位是否有中间步骤被强制取整的情况。
内容的提问来源于stack exchange,提问作者KingWolin
相关产品推荐
相关产品推荐

