ama*_*rcy 9 sql-server scientific-notation openrowset
我使用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
Run Code Online (Sandbox Code Playgroud)
并非CSV文件中的所有值都具有科学记数法,没有它的值,例如81000没有问题.
Aar*_*and 15
对于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
Run Code Online (Sandbox Code Playgroud)
然后我运行了以下代码(由于某种原因,我无法让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, CONVERT(FLOAT, Value)) FROM #dataTemp;
GO
DROP TABLE #dataTemp;
Run Code Online (Sandbox Code Playgroud)
结果:
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
Run Code Online (Sandbox Code Playgroud)
小智 5
首先,你有一个科学记数法的事实意味着它可能是Excel或其他创建该值的程序已经丢失了一些数据....换句话说,符号内的原始数字被转换,所以一些数字和准确性是丢失.这是许多从Excel和CSV转换的Microsoft产品的问题.
其次,这是一个更好的转换piefce,将数字转换为字符串:
CONVERT(nvarchar(255),LTRIM(RTRIM(str(ISNULL(YOUR_NUMBER,0),20,0))))
Run Code Online (Sandbox Code Playgroud)