SSIS -CSV导入后在字段中获取额外数字

qfe3c7zg  于 2023-01-15  发布在  其他
关注(0)|答案(3)|浏览(182)

我有一个非常奇怪的问题,我想知道是否有人以前见过这个问题。在我的数据流任务中,它截断了十几个表,然后用CSV文件的内容重新填充它们。
我导入的字段是浮点型的。在CSV中,值是7692.31,但当我导入它时,导入的字段是7692.31005859375。我在CSV中看不到多余的005859375。
我试过手动截断表,然后重新导入值,我可以看到它正在被重新导入。我也检查过,没有其他平面文件导入指向该表。此外,我试过使用该数量的派生列,仍然得到小数。我试过将其四舍五入到2个小数位,仍然得到11个小数位。但如果我将其四舍五入到0,那么我就没有小数位数了(正如预期的那样)。
所以,我有点难住了。我的意思是,这些值是从哪里来的?它们不是每一行都一样的,有些行甚至没有小数位。为什么它们不四舍五入?我想可能是因为一次导入太多了,但是当我删除所有其他的时候,我遇到了同样的问题。在制表符分隔的文件中会有隐藏的字符吗?
任何帮助都将不胜感激。
埃里克

rqenqsqc

rqenqsqc1#

这是浮点错误。一些以10为底的终止小数变成了以2为底的重复小数。大多数情况下,现代编程语言隐藏了这一点或在内部处理它,但SQL中的floatreal数据类型却没有。
the documentation for float and real data types开始:
用于浮点数字数据的近似数字数据类型。浮点数据是近似值;因此,并非数据类型范围内的所有值都能准确表示。
如果需要精确的数字,请使用numeric or decimal data types,它是精确的。
编辑:对不起,我当时正准备离开办公室,匆忙中弄得不清楚也不完整,我其实是想撤帖的!
完成:
这里的问题不一定是SQL Server数据类型,而是SSIS如何使用SQL Server数据类型并将其转换为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。然后,它在将该值推送到数据库时插入该值。
我不确定这是否是问题发生的地方,但是在所有数据转换的 * 某个 * 地方,* 某个 * 函数以IEEE 754表示形式存储该数字,并以这种方式传递到SQL Server。

ocebsuys

ocebsuys2#

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

wvmv3b1j

wvmv3b1j3#

我遇到了同样的问题,使用SSM数据库-任务-导入平面文件-只是一个简单的数据导入。平面文件只有2个十进制数字,但导入到浮点型,并得到了所有这些奇怪的额外不精确的数字。阅读有关IEEE 754的其他答案让我想到,有一个额外的数据转换,我不想或不需要。所以在预览数据屏幕,在底部,取消勾选“使用丰富的数据类型检测”,这为我修复了它。仍然使用浮点数,所有相同的导入数据,但它都加载到SQL正好2位数的预期。

相关问题