ssis如何读取底层数据类型?

问题描述 投票:0回答:1

我有一个 Excel 文件,其中有 1 列数字类型的值,小数点后有 2 位数字。示例:21.00

在我的 ssis 包中,我添加了一个插入此文件的 Excel 数据源。

我可以看到输入列格式是双精度浮点数。输出格式也是双精度浮点数。

如果我将其存储到数据库表中[列类型 varchar(100)],那么它会存储为 20.999999999

如果我将 Excel 数据源任务的输出列属性更改为 DT_DECIMAL,则数据将作为 21.00 进入数据库表

幕后发生了什么?

我理解 ssis 读取前 8 个值来确定数据类型。但是是什么导致了上述行为。

ssis
1个回答
0
投票

你说得对! 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

https://www.red-gate.com/simple-talk/databases/sql-server/bi-sql-server/importing-excel-data-into-sql-server-via-ssis-questions-you-我们太害羞了,不敢问/

https://www.databasejournal.com/ms-sql/importing-excel-data-into-ssis-2008-using-data-conversion-transformation/

© www.soinside.com 2019 - 2024. All rights reserved.