sql-server – 使用OpenRowSet导入.CSV文件时,将科学符号转换为f
发布时间:2020-12-12 08:30:03 所属栏目:MsSql教程 来源:网络整理
导读:我使用openrowset将csv文件导入SQL Server. csv文件中的列之一包含科学符号(1.08E 05)中的数字,表中正在插入的列 默认情况下,它将值设置为1,忽略.08E 05. 我已经尝试使用cast()和convert()来直接在查询执行时转换值,以及将表中的数据类型设置为字符串并将其导
我使用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:datawhatever.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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |