【问题标题】:SSIS - Getting extra digits in field after CSV importSSIS - CSV导入后在字段中获取额外数字
【发布时间】:2015-11-02 19:28:14
【问题描述】:

我有一个非常奇怪的问题,我想知道是否有人以前见过这个问题。 在我的数据流任务中,它会截断十几个表,然后用 CSV 文件的内容重新填充它们。

我有一个要导入的字段是一个浮点数。在 CSV 中,值为 7692.31,但当我导入它时,导入的字段是 7692.31005859375。我在 CSV 中的任何地方都看不到额外的 005859375。

我尝试手动截断表格,然后重新导入值,我可以看到它正在重新导入。我也检查过,其他平面文件导入都没有指向该表。另外,我尝试了一个只有这个数量的派生列,仍然得到小数。我试图将它四舍五入到小数点后 2 位,但我仍然得到小数点后 11 位。但是如果我将它四舍五入到 0,那么我就没有小数位(如预期的那样)。

所以,我有点难过。我的意思是,这些值来自哪里?它们对于每一行都不相同,有些行甚至没有这些小数位。他们为什么不四舍五入?我认为这可能是因为一次有太多的导入,但是当我删除所有其他的时,我遇到了同样的问题。制表符分隔文件中是否存在隐藏字符?

任何帮助将不胜感激。

埃里克

【问题讨论】:

  • 您如何查看文件以说出它只有两位小数?如果您在 Excel 中打开它,Excel 倾向于更改数据的查看方式(即仅显示 2 位小数,或根据机器区域设置显示日期)。尝试在记事本等文本编辑器中打开文件,然后重新检查源文件中实际上没有那么多小数。

标签: sql-server csv ssis


【解决方案1】:

这是浮点错误。一些以 10 为底的终止小数部分成为以 2 为底的重复小数。在大多数情况下,现代编程语言隐藏或在内部处理它,但 SQL 中的 floatreal 数据类型不会。

来自the documentation for float and real data types

用于浮点数值的近似数数据类型 数据。浮点数据是近似的;因此,并非所有值 数据类型范围可以精确表示。

如果您想要精确的数字,请使用精确的numeric or decimal data types


编辑:对不起,我正在离开办公室的路上,最后因为匆忙而不清楚和不完整。我实际上是想取消我的帖子!

完成:

这里的问题不一定与 SQL Server 数据类型有关,而是 SSIS 如何使用并转换为 SQL Server 数据类型。我打赌你已经将 SSIS 中的数据类型配置为 DT_R8,因为这是双精度浮点数,that's what SSIS uses by default for float

MS SQL Server 的双精度也差不多是an IEEE 754 implementation。好吧,7692.31 的 IEEE 754 表示恰好是 7692.31005859375。很容易找到 an IEEE 754 converter online 进行测试。

因此,SSIS 读取值 7692.31 并将其存储为双精度浮点数。由于 IEEE 754 表示的工作方式,SSIS 实际存储的数字是7692.31005859375。然后在将其推送到数据库时插入该值。

我不确定问题是否出在哪里,但 somewhere 在那里进行了所有数据转换,some 函数将该数字存储在它的 IEEE 754 表示中,并以这种方式传递给 SQL Server。

【讨论】:

  • 浮点数确实是近似值,但我从未听说过它会添加超出实际数据精度的随机数字。你有吗?
  • @TabAlleman 不过,它们不是随机数字。将 7692.31 表示为双精度浮点二进制数的标准方法是改用数字 7692.31005859375。请参阅我的编辑/添加。
  • 优秀的答案。浮点数据类型用于存储非常非常大的值(出现在科学方程式中的类型,例如 2.1E+26)。除非您的数据包含这些类型的值,否则不要使用浮点数,因为您无法保证将存储的值。请改用精确的数据类型,例如数字。
【解决方案2】:

在使用浮点/十进制/数字/日期时,您还需要考虑检查区域设置区域以不同方式处理数据。美国可能不会将日期格式化为您当前的地区,在浮动中某些地区使用 a ,与 a 相同。

【讨论】:

    猜你喜欢
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    相关资源
    最近更新 更多