向 SQL 插入数据时由于科学记数法导致的错误

Posted

技术标签:

【中文标题】向 SQL 插入数据时由于科学记数法导致的错误【英文标题】:Error due to scientific notation when inserting data to SQL 【发布时间】:2013-10-01 12:39:24 【问题描述】:

我正在尝试将 csv 文件中的批量插入到 SQL 表中。但是,我的专栏之一包含带有科学记数法的数字,例如3E-4。让我们将此列命名为 Column X

我首先尝试为 Column X 创建一个 numeric(18,9) 类型的表,但是当我尝试向表中批量插入数据时,我遇到了 X 列的类型不匹配错误。

正如post 所建议的那样,我尝试了以下替代解决方案:我创建了另一个表,其中的列是varchar(255) 类型。在这种情况下,批量插入没有问题。但是在插入数据之后,我尝试将 Column X 的列类型从 varchar(255) 更改为 float。这给了我错误Error converting datatype varchar to float

我不知道如何处理这个问题。 Microsoft 网站建议如下:“要解决此问题,请使用格式文件将科学计数法浮点数据批量导入十进制列。在格式文件中,明确将该列描述为实数或浮点数据。”

我不知道如何创建格式文件。这是解决此问题的唯一方法吗?如果是这样,任何人都可以帮助使用格式文件,或者提供替代解决方案吗?

谢谢!

【问题讨论】:

看看this post是否为你提供了任何内部信息。 谢谢。我已经参考了那篇文章,并尝试将数据插入varchar 列,然后将列类型转换为float(如我的帖子中所述)。但在我的情况下它不起作用。 【参考方案1】:

我在编写 ETL 过程时遇到了同样的问题。将暂存数据移动到实际的核心表中,并且我们在暂存表上的所有列都是 NVARCHAR 我所做的解决方案是,在插入核心之前,我将该列转换为适当的数值。 您已经拥有 NVARCHR 列,因此您需要根据需要使用 Float 和 Again Numeric 在同一列上执行更新。

DECLARE @t NUMERIC(28,10)
SELECT @t=CONVERT(NUMERIC(28,10),CONVERT(FLOAT,'1.2408E+12'))
SELECT @t

update <tablename> SET <ColumnName> = CONVERT(NUMERIC(28,10),CONVERT(FLOAT,<ColumnName>))

然后执行 ALTER 操作。但请记住,如果您要在同一列中插入下一个 BCP,那么最好有另一列以正确的数据类型存储值。 如果您因为“转换为数据类型时出错 ....”而遇到 INSERT 失败,这意味着有些数据无法转换为数值。请参阅有关该问题的另一篇文章。

Characters to look for as whole value with ISNUMERIC SQL function

【讨论】:

【参考方案2】:

像这样创建一个格式文件:

bcp [database].dbo.[table] format nul -c -x -f .\[formatfilename].xml -t, -T

然后将xsi:type="SQLNUMERIC" 更改为xsi:type="SQLFLT8" 并在批量导入时使用该格式文件。

【讨论】:

以上是关于向 SQL 插入数据时由于科学记数法导致的错误的主要内容,如果未能解决你的问题,请参考以下文章

怎样向SQL Server中大批量插入数据

将excel数据导入sql中,出现科学计数法

如何把SQL server 表里插入转换科学计数法的方法。

VARCHAR 到数字转换,科学记数法导致转换错误 - 需要建议

《Python数据科学手册》异常校正

SQL 啥时候使用科学记数法?