9

我正在使用 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 没有问题。

4

3 回答 3

16

对于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, 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-19T15:17:46.177 回答
5

首先,您拥有科学记数法这一事实意味着它可能的 Excel 或其他创建该值的程序丢失了一些数据....换句话说,记数法中的原始数字已被转换,因此一些数字和准确性是丢失的。这是许多从 Excel 和 CSV 转换的 Microsoft 产品的问题。

其次,这是一个将数字转换为字符串的更好的转换部分:

CONVERT(nvarchar(255),LTRIM(RTRIM(str(ISNULL(YOUR_NUMBER,0),20,0))))
于 2011-12-15T23:19:24.830 回答
5

会把它当作一部真正的作品吗?

select cast('1.08E+05' as real)
于 2011-09-19T15:17:32.033 回答