我使用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