我正在使用openrowset将csv文件导入SQL Server。csv文件中的一列包含以科学记数法(1.08E+05)表示的数字以及要插入的表中的列
默认情况下,它将值导入为1并忽略.08E+05。
我尝试过在执行查询时使用cast()和convert()直接转换值,并将表中的数据类型设置为字符串并将其导入。所有这些方法都具有相同的行为,即忽略.08E+05。
有没有办法在没有.08E+05的情况下将值导入为108000而不是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没有问题。
发布于 2011-09-19 23:17:46
对于BULK INSERT方法,我经常发现更简单的方法是首先将数据移动到包含所有可变字符的表中,然后去掉引号分隔符和修复格式等无关紧要的东西。我记得有一段时间摆脱了科学记数法,你可以只玩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, CONVERT(FLOAT, 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发布于 2011-09-19 23:17:32
会把它塑造成一个真正的作品吗?
select cast('1.08E+05' as real)发布于 2011-12-16 07:19:25
首先,你有一个科学的记数法,这意味着它可能是由Excel或者其他程序产生的,已经丢失了一些data....in,换句话说,记数法中的原始数字被转换了,所以一些数字和准确性就丢失了。这是许多从Excel和CSV转换的Microsoft产品的问题。
其次,下面是一个更好的转换方法,它可以将数字转换为字符串:
CONVERT(nvarchar(255),LTRIM(RTRIM(str(ISNULL(YOUR_NUMBER,0),20,0))))https://stackoverflow.com/questions/7473081
复制相似问题