excel表上传到sqlserver的问题

时间:2010-07-13 10:11:00

标签: sql-server sql-server-2005

我需要将Excel工作表上传到数据库中。我正在使用查询

SELECT * INTO temp FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'Excel 8.0;Database=C:\Dokumente und Einstellungen\l.varada\Desktop\BA-Control.xls',
    'SELECT * FROM [qry_BA_Controlling (Report)$]')

这里C:\ Dokumente和Einstellungen \ l.varada \ Desktop \ BA-Control.xls是需要获取excel文件的路径。 qry_BA_Controlling(Report)是工作表的名称。

因此,在执行查询时,会创建一个名为“temp”的表。使用从excel填充的记录。

现在我在excel中有一个日期字段。有时,此字段的值未正确上载到临时表中。此日期字段的值设置为NULL,尽管它们具有EXCEL中的值。

修改 我修改了我的查询,

Insert into temp Select * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
    'Excel 8.0;Database=C:\Dokumente und Einstellungen\l.varada\Desktop\BA-Control.xls',
     HDR=YES', 'SELECT * FROM [qry_BA_Controlling (Report)$]')

这里temp是一个现有的表,我已经将字段[创建日期]的日期类型定义为varchar并上传了excel。然后我使用转换将数据类型更改为正确的格式..

update temp set [Creation date] = CONVERT (varchar,[Creation date],101)

即使现在它正在填充NULL值..或者这个转换需要在上传时完成。如果是的话,请告诉我。

我认为这背后的原因是,这一列的前几个值是空格,之后它有值..因为它通过检查前几行确定数据类型..然后它分配NULL ..请指教我另类。

2 个答案:

答案 0 :(得分:0)

首先要注意这种方法不适用于x64版本的SQL Server,因为没有可用的x64 MS Excel驱动程序。我已经看到人们在32位上编写内容然后在生产中部署到x64时会遇到这种情况。

您正在使用SELECT INTO,我认为这意味着Excel驱动程序正在查看前100行(或类似行)并确定此字段是日期。

我认为SQL Server最有可能使日期格式错误,您可能会发现NULL值是不符合美国日期时间格式的值。所以我们(欧洲人)会接受31/7/2010,但这是不可接受的MM / dd / yyyy格式。

我的建议是使用int,float或varchar等所有字段预定义临时表。然后手动将它们(如果方便的话使用视图)转换为正确的类型。如果我对问题的日期格式是正确的,您可以使用CONVERT函数强制使用正确的日期格式。

答案 1 :(得分:0)

我已经修改了查询,现在它可以从excel导入数据。

EXEC('SELECT * INTO temp FROM OPENROWSET(''Microsoft.Jet.OLEDB.4.0'', ''Excel 8.0; Database ='+ @ba_bm_status +'; HDR = YES; IMEX = 1'','+  '''SELECT * FROM [qry_BA_Controlling(Report)$]'''');

我已经包含IMEX = 1,它告诉驱动程序使用导入模式。