2010-07-13 68 views
0

我需要将excel表格上传到数据库。对此我与查询excel表格上传到sqlserver的问题

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 UND Einstellungen \ l.varada \桌面\ BA-Control.xls是从哪儿Excel文件需要获取的路径。 qry_BA_Controlling(Report)是工作表的名称。

因此,在执行查询时,会创建一个名称为“temp”的表。随着从Excel中填充的记录。

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

EDIT 我已经修改我的查询,以便,

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)$]') 

这里温度是一个已有的表,我已定义的字段[创建日期]的日期类型为varchar和上传的Excel中。然后我用转换的数据类型更改为正确的格式..

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

即使是现在它被填充NULL values..Or这种转换需要在上传工作要做。如果是这样,请让我知道。

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

+0

您是否尝试过使用GUI?我以前在openrowsets中遇到了很多问题,GUI很快就被修复了。 – 2010-07-13 10:28:47

+0

我在网上搜索到使用GUI将excel数据导入到sql server。它将我路由到某些需要支付的共享软件代码。 能否请您详细解释或请给我一个链接。 – satya 2010-07-13 14:36:14

+0

只是谷歌“SQL服务器数据导入/导出向导”;) 例如,请参阅:http://www.databasejournal.com/features/mssql/article.php/3580216/SQL-Server-2005-Import-- Export-Wizard.htm – 2010-07-14 10:54:19

回答

0

我修改了查询,现在可以从excel中导入数据。 (''Microsoft.Jet.OLEDB.4.0'',' ''Excel 8.0; Database ='+ @ba_bm_status +'; HDR = YES; IMEX = 1'')(EXEC('SELECT * INTO temp FROM OPENROWSET'''''Microsoft.Jet.OLEDB.4.0'', ''Excel 8.0; Database ='+ @ba_bm_status +'; ,'+ '''SELECT * FROM [qry_BA_Controlling(Report)$]'')');

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

0

首先要小心这种方法不适用于SQL Server的x64版本,因为没有可用的x64 MS Excel驱动程序。我看到有人在32位上编写某些东西,然后在生产环境中部署到x64时被这个问题困扰。

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

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

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

+0

非常感谢回复!请看看编辑过的问题,让我知道我是否可以做更多的事情。 – satya 2010-07-13 13:08:36

+0

好的,越来越近。很难在没有看到数据的情况下进行猜测,但我认为你的CONVERT语句是错误的。 update temp set [创建日期] = CONVERT(datetime,[CreationDateAsVarChar],101) 您应该将Excel文件插入到所有字段均为varchar的表中。然后将它们转换为具有正确类型的单独表格。 – 2010-07-15 00:07:28