将Excel电子表格列导入SQL Server数据库

64

我有一个Excel电子表格,我想要将选定的列导入到我的SQL Server 2008数据库表中。向导没有提供这个选项。

是否存在任何简单的代码选项?

15个回答

51

连接到 Sql Server 2005 数据库后,从“对象资源管理器”窗口中右键单击要导入表的数据库。选择“任务”->“导入数据”。 这是一个简单的工具,可以让您将传入的数据“映射”到适当的表中。 您可以保存脚本以便需要时再次运行。


1
使用SQL Server Management Studio连接到您的数据库。然后这个答案就有意义了。此任务启动SQL Server导入和导出向导,其中包括Microsoft Excel作为数据源。这与运行本地导入和导出SSIS应用程序不同,后者没有此选项}:-(。 - Suncat2000
2
2008年的菜单中没有“导入数据”任务。 - Brian Knoblauch
2
在使用 SQL Server 2008(不是 R2 版本)时,右键单击数据库时,我确实看到“任务”-->“导入数据”的选项。 - Ash Machine
1
如果没有安装SSIS,则无法使用此选项。如果您正在使用已安装此选项的SQL Server上的SSMS,则应该具有此选项。如果您在仅安装客户端工具(仅SSMS)的计算机上,则不会看到该选项。 - Nick.McDermaid

25

Microsoft提供了多种方法:

  • SQL Server数据转换服务(DTS)
  • Microsoft SQL Server 2005集成服务(SSIS)
  • SQL Server链接服务器
  • SQL Server分布式查询
  • ActiveX数据对象(ADO)和Microsoft OLE DB提供程序为SQL Server
  • ADO和Microsoft OLE DB Provider for Jet 4.0

如果向导(DTS)不能正常工作(我认为它应该可以),您可以尝试类似于http://www.devasp.net/net/articles/display/771.html这样的方法,基本上建议执行以下操作:

INSERT INTO [tblTemp] ([Column1], [Column2], [Column3], [Column4])

SELECT A.[Column1], A.[Column2], A.[Column3], A.[Column4]
FROM OPENROWSET 
('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=D:\Excel.xls;HDR=YES', 'select * from [Sheet1$]') AS A;

嗯,这意味着我必须在服务器上安装Excel而不是我的个人电脑。有没有办法将其指向我的个人电脑?我还没有找到答案。 - user47206
当我尝试这样做时,我收到了错误信息:“FROM子句中的语法错误。(Microsoft JET Database Engine)” - Techboy
你可以尝试下载这个文件 http://www.microsoft.com/en-us/download/details.aspx?id=13255,适用于64位系统。我没有测试过,但看起来很有前途。 - ncubica

12

虽然这听起来有些绕,但你可能想考虑使用 Excel 生成 INSERT SQL 代码,并将其粘贴到查询分析器中以创建表。

如果无法使用向导,因为 Excel 文件不在服务器上,这种方法也可以有效地应用。


这个(链接)是我用于将数据插入MySQL的类似方法(同样的方法也可以在这里使用)。 - VenerableAgents

7
您可以使用OPENROWSET,例如:
SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
  'Excel 8.0;IMEX=1;HDR=NO;DATABASE=C:\FILE.xls', 'Select * from [Sheet1$]'

请确保路径是服务器上的路径,而不是您本地计算机上的路径。


1
无法访问我的本地机器? - user47206
1
你可以在本地机器上创建一个共享,然后从 SQL Server 机器映射网络驱动器到该共享,并以此方式访问文件... - marc_s
我遇到了错误,无法为链接服务器“(null)”创建OLE DB提供程序“Microsoft.Jet.OLEDB.4.0”的实例。 - David Sopko
什么操作系统?如果是旧的,你可能需要安装MDAC。 - SqlACID

4
go
sp_configure 'show advanced options',1  
reconfigure with override  
go  
sp_configure 'Ad Hoc Distributed Queries',1  
reconfigure with override  
go
SELECT * into temptable
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
                'Excel 8.0;Database=C:\Documents and Settings\abhisharma\Desktop\exl\ImportExcel2SQLServer\ImportExcel2SQLServer\example.xls;IMEX=1',
                'SELECT * FROM [Sheet1$]')

select * from temptable

4
另外一种选择是在Excel中使用VBA编写宏来解析电子表格数据并将其写入SQL。
这里有一个示例:http://www.ozgrid.com/forum/showthread.php?t=26621&page=1
Sub InsertARecord() 
Dim cnt As ADODB.Connection 
Dim rst As ADODB.Recordset 
Dim stCon As String, stSQL As String 
Set cnt = New ADODB.Connection 
Set rst = New ADODB.Recordset 

stCon = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=JOEY" 
cnt.ConnectionString = stCon 
stSQL = "INSERT INTO MyTable (Price)" 
stSQL = stSQL & "VALUES (500)" 

cnt.Open 
rst.Open stSQL, cnt, adOpenStatic, adLockReadOnly, adCmdText 

If CBool(rst.State And adStateOpen) = True Then rst.Close 
Set rst = Nothing 
If CBool(cnt.State And adStateOpen) = True Then cnt.Close 
Set cnt = Nothing 

End Sub

3

3
我假设您所说的“the wiz”是指“SQL Server导入和导出向导”。(我也很新,所以我不理解大多数问题,更不用说大多数答案了,但我想我明白这个问题)。如果是这样,您不能将电子表格或其副本删除不需要导入的列,然后使用向导吗?
我一直发现它可以满足我的需求,而且我只使用SQL Server 2000(不确定其他版本有何不同)。
编辑:实际上,我现在正在查看它,我似乎能够选择要映射到现有表中哪些行的哪些列。在“选择源表和视图”屏幕上,我选中正在使用的数据表,选择“目标”,然后单击“编辑...”按钮。从那里,您可以选择Excel列和表列以进行映射。

2
Microsoft Access是另一个选项。您可以在本地计算机上拥有一个Access数据库,将Excel电子表格导入其中(可用向导),并通过ODBC链接链接到SQL Server数据库表
然后,您可以在Access中设计一个查询,将Excel电子表格中的数据添加到SQL Server表中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接