我有一个 Excel 文件,其中有 1 列数字类型的值,小数点后有 2 位数字。示例:21.00
在我的 ssis 包中,我添加了一个插入此文件的 Excel 数据源。
我可以看到输入列格式是双精度浮点数。输出格式也是双精度浮点数。
如果我将其存储到数据库表中[列类型 varchar(100)],那么它会存储为 20.999999999
如果我将 Excel 数据源任务的输出列属性更改为 DT_DECIMAL,则数据将作为 21.00 进入数据库表
幕后发生了什么?
我理解 ssis 读取前 8 个值来确定数据类型。但是是什么导致了上述行为。
你说得对! SSIS 读取前 8 行以确定数据类型。这是由注册表中的“TypeGuessRows”设置控制的,可以将其配置为不同的值(我不建议更改它)。
对于数值,如果 SSIS 在初始行中看到小数点,它可能会将数据解释为双精度浮点数 (DT_R8)。
DT_R8 是一种浮点数据类型,可能存在精度问题,因为它以允许较大范围的方式表示数字,但也可能导致较小的舍入误差,这就是为什么您会看到 21.00 在数据库中存储为 20.999999999您将其映射到 varchar 字段。
另一方面,DT_DECIMAL 是一种具有精确精度和小数位数的定点数字数据类型,这就是当您显式转换为 DT_DECIMAL 时保留值 21.00 的原因。
如果我遵循后面的逻辑,发生的情况是,当 SSIS 将数据读取为 DT_R8 时,它会按原样存储浮点数,这可能会导致较小的精度误差。 当您将此值存储为 varchar 时,SQL Server(我猜)会将浮点数转换为字符串表示形式,这可能会暴露这些小的精度错误(例如 20.999999999 而不是 21.00)。 当您选择 DT_DECIMAL 时,SSIS 会强制数据在存储到数据库之前保持其精确的小数精度,因此它会保留 21.00。
一些可以帮助您的链接: https://sqlsrv4living.blogspot.com/2018/08/ssis-import-mixed-data-types-from-ms.html