1

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

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

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

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

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

谢谢!

4

2 回答 2

0

我在编写 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 失败,这意味着有些数据无法转换为数字。请参阅有关该问题的另一篇文章。

使用 ISNUMERIC SQL 函数作为整数查找的字符

于 2013-10-01T21:01:26.290 回答
0

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

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

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

于 2018-10-18T16:22:42.723 回答