sql-server – 使用OpenRowSet导入.CSV文件时,将科学符号转换为float

我使用openrowset将csv文件导入sql Server. csv文件中的列之一包含科学符号(1.08E 05)中的数字,表中正在插入的列

认情况下,它将值设置为1,忽略.08E 05.

我已经尝试使用cast()和convert()来直接在查询执行时转换值,以及将表中的数据类型设置为字符串并将其导入.所有这些方法都具有相同的行为,忽略.08E 05.

有没有办法将值导入为108000而不是没有.08E 05的1,而不必更改csv文件本身?

将数据类型设置为varchar并在csv文件中读取似乎与以下代码具有相同的效果

CREATE TABLE #dataTemp (StartDate datetime,Value varchar(12))

SET @insertDataQuery = 'SELECT Date,CSVValue from OpenRowset(''MSDAsql'',''Driver={Microsoft Text Driver (*.txt; *.csv)}; DefaultDir=' 
SET @insertDataQuery = @insertDataQuery + 'C:\Data\;'',''SELECT * FROM '+ '11091800.csv' + ''')'

INSERT INTO #dataTemp EXEC(@insertDataQuery)

SELECT * FROM #dataTemp

不是CSV文件中的所有值都不具有科学符号和没有它的值,例如. 81000遇到没有问题.

解决方法

对于BULK INSERT方法,我经常发现,首先将数据移动到所有varchars的表中更简单,然后摆脱诸如引用的分隔符和修复格式的无关的事情.我记得有一个时间摆脱科学记谱法,你可以玩varchar表,直到你正确.我记得尝试各种精度/比例组合,直到我终于找到一个兼容的.我想对我来说是FLOAT然后DECIMAL(24,12)…

SELECT CONVERT(DECIMAL(24,12),CONVERT(FLOAT,’1.08E 05′));

编辑添加了我做的尝试重现和/或展示一个较不复杂的方式.

我创建了一个非常简单的CSV文件

StartDate,Value
20110808,81000
20110808,1.08E+05

然后我运行以下代码(由于某种原因,我无法让MSDAsql在我的机器上运行以挽救我的生命):

CREATE TABLE #dataTemp(StartDate DATETIME,Value VARCHAR(32));

BULK INSERT #dataTemp FROM 'C:\data\whatever.csv' 
    WITH (ROWTERMINATOR='\n',FIELDTERMINATOR=',',FirsTROW = 2);

SELECT * FROM #dataTemp
GO
SELECT StartDate,CONVERT(INT,Value)) FROM #dataTemp;
GO
DROP TABLE #dataTemp;

结果:

StartDate               Value
----------------------- --------
2011-08-08 00:00:00.000 81000
2011-08-08 00:00:00.000 1.08E+05

StartDate               (No column name)
----------------------- ----------------
2011-08-08 00:00:00.000 81000
2011-08-08 00:00:00.000 108000

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...