向 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 插入数据时由于科学记数法导致的错误的主要内容,如果未能解决你的问题,请参考以下文章