将 float 转换为数据类型 numeric 的算术溢出错误

Pet*_*tze 6 sql-server

我正在尝试将数据从 csv 文件移动到 SQL 服务器数据库中。我的一些价值观是科学记数法。我想出了如何转换它们中的大部分,但是对于一个值,我得到了算术溢出错误。

导致错误的值是4.56621E-6。如果我通过删除 1 来更改 E 之前的部分,那么它会读取4.5662E-6导入工作正常。我需要导入的所有其他值都可以正常工作。

我使用格式文件来导入数据。在让我感到悲伤的专栏的下方:

88  SQLFLT8 0   0   "," 89  PPL_2_BL    ""
Run Code Online (Sandbox Code Playgroud)

数据库中的格式是十进制(18,9)。关于如何在不手动更改源文件中的值的情况下避免此错误的任何建议?

把它放在眼里。CSV 文件包含超过 220 万行,每行 154 列。这导致 CSV 文件大小超过 2GB。目前我正在处理一个测试文件。当最终上线时。我需要快速切换。这意味着我几天都无法分析和编辑文件。

更新

我稍微玩弄了这些值。

4.56621E-6   -> fails
6.5789474E-6 -> works
4.5662E-6    -> works
4.56622E-6   -> fails
4.566210E-6  -> works (surprisingly)
4.66621E-6   -> fails
Run Code Online (Sandbox Code Playgroud)

Pet*_*tze 0

不幸的是,该列的成功导入具有误导性。数据最终不会出现在表中。该列仅包含 0 作为值。

结论

如果您有浮点格式的数据,请将其导入浮点或文本列中。将其导入小数列时不起作用。为了获得最大的灵活性,请将所有内容导入到临时表中,其中所有列均为 varchar,然后格式化数据并进行错误检查。完成后将其放入决赛桌。....或使用适当的 ETL 工具。

免责声明:我不确定XML格式文件是否更强大并提供更好的数据转换功能。

我做了什么

我与该公司合作,他们提供了导出格式。幸运的是,他们知道哪些列可能发生这种情况,并将这些列的格式设置为始终适合小数列的格式。我可以使用我的原始格式文件。