如何将数据从 Excel 导入到 SQL Server

本文中的示例使用以下工具导入 Excel 数据:

  • SQL Server 数据传输服务 (DTS)
  • Microsoft SQL Server 2005 Integration Services (SSIS)
  • SQL Server 链接服务器
  • SQL Server 分布式查询
  • ActiveX 数据对象 (ADO) 和 Microsoft OLE DB Provider for SQL Server
  • ADO 和 Microsoft OLE DB Provider for Jet 4.0

导入与追加

本文使用的示例 SQL 语句演示了“创建表”查询。该查询通过使用 SELECT...INTO...FROM 语法将 Excel 数据导入新的 SQL Server 表。如这些代码示例所示,在继续引用源对象和目标对象时,可以通过使用 INSERT INTO...SELECT...FROM 语法将这些语句转换成追加查询。

 

 

 使用 DTS 或 SSIS

可以使用“SQL Server Data Transformation Services (DTS) 导入向导”或“SQL Server 导入和导出向导”将 Excel 数据导入到 SQL Server 表中。在逐步执行向导并选择 Excel 源表时,要记住附加美元符号 ($) 的 Excel 对象名称代表工作表(例如,Sheet1$),而没有美元符号的普通对象名称代表 Excel 指定的范围。

 

 

 使用链接服务器

要简化查询,可以将 Excel 工作簿配置为 SQL Server 中的链接服务器。有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

306397  (http://support.microsoft.com/kb/306397/EN-US/ ) 如何:结合 SQL Server 链接的服务器和分布式查询使用 Excel

下列代码将 Excel 链接服务器“EXCELLINK”上的 Customers 工作表数据导入新的名为 XLImport1 的 SQL Server 表:

SELECT * INTO XLImport1 FROM EXCELLINK...[Customers$]

还可以通过按照以下方式使用 OPENQUERY 以全通过方式对源数据执行查询:

SELECT * INTO XLImport2 FROM OPENQUERY(EXCELLINK,
'SELECT * FROM [Customers$]')

 使用分布式查询

如果不想将对 Excel 工作簿的永久连接配置为链接服务器,可以通过使用 OPENDATASOURCE 或 OPENROWSET 函数为特定目的导入数据。下列代码示例也能将 Excel Customers 工作表数据导入新的 SQL Server 表:

SELECT * INTO XLImport3 FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
'Data Source=C:\test\xltest.xls;Extended Properties=Excel 8.0')...[Customers$]

 

SELECT * INTO XLImport4 FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'Excel 8.0;Database=C:\test\xltest.xls', [Customers$])

SELECT * INTO XLImport5 FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'Excel 8.0;Database=C:\test\xltest.xls', 'SELECT * FROM [Customers$]')

 使用 ADO 和 SQLOLEDB

当通过使用 Microsoft OLE DB for SQL Server (SQLOLEDB) 在 ADO 应用程序中连接到 SQL Server 时,可以使用与“使用分布式查询” 一节中相同的“分布式查询”语法将 Excel 数据导入 SQL Server。

 

下列 Visual Basic 6.0 代码示例要求添加对 ActiveX 数据对象 (ADO) 的项目引用。此代码示例还演示了如何在 SQLOLEDB 连接上使用 OPENDATASOURCE 和 OPENROWSET。

    Dim cn As ADODB.Connection
Dim strSQL As String
Dim lngRecsAff As Long
Set cn = New ADODB.Connection
cn.Open "Provider=SQLOLEDB;Data Source=<server>;" & _
"Initial Catalog=<database>;User ID=<user>;Password=<password>"

 

'Import by using OPENDATASOURCE.
strSQL = "SELECT * INTO XLImport6 FROM " & _
"OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0', " & _
"'Data Source=C:\test\xltest.xls;" & _
"Extended Properties=Excel 8.0')...[Customers$]"
Debug.Print strSQL
cn.Execute strSQL, lngRecsAff, adExecuteNoRecords
Debug.Print "Records affected: " & lngRecsAff

'Import by using OPENROWSET and object name.
strSQL = "SELECT * INTO XLImport7 FROM " & _
"OPENROWSET('Microsoft.Jet.OLEDB.4.0', " & _
"'Excel 8.0;Database=C:\test\xltest.xls', " & _
"[Customers$])"
Debug.Print strSQL
cn.Execute strSQL, lngRecsAff, adExecuteNoRecords
Debug.Print "Records affected: " & lngRecsAff

'Import by using OPENROWSET and SELECT query.
strSQL = "SELECT * INTO XLImport8 FROM " & _
"OPENROWSET('Microsoft.Jet.OLEDB.4.0', " & _
"'Excel 8.0;Database=C:\test\xltest.xls', " & _
"'SELECT * FROM [Customers$]')"
Debug.Print strSQL
cn.Execute strSQL, lngRecsAff, adExecuteNoRecords
Debug.Print "Records affected: " & lngRecsAff

cn.Close
Set cn = Nothing

 使用 ADO 和 Jet Provider

上一节中的示例使用 ADO 和 SQLOLEDB Provider 连接到从 Excel 到 SQL 导入的目标。也可以使用 OLE DB Provider for Jet 4.0 来连接到 Excel 源。

 

Jet 数据引擎可以通过使用具有三种不同格式的特殊语法来在 SQL 语句中引用外部数据库:

  • [Full path to Microsoft Access database].[Table Name]
  • [ISAM Name;ISAM Connection String].[Table Name]
  • [ODBC;ODBC Connection String].[Table Name]

本节使用第三种格式创建到目标 SQL Server 数据库的 ODBC 连接。可以使用 ODBC 数据源名称 (DSN) 或者 DSN-less 连接字符串:

DSN:
[odbc;DSN=<DSN name>;UID=<user>;PWD=<password>]

 

DSN-less:
[odbc;Driver={SQL Server};Server=<server>;Database=<database>;
UID=<user>;PWD=<password>]

疑难解答

  • 记住附加美元符号 ($) 的 Excel 对象名称代表工作表(例如:Sheet1$),而普通对象名称代表 Excel 指定的范围。
  • 在某些环境中,特别是用表名称取代 SELECT 查询指派 EXCEL 源数据时,目标 SQL Server 表中的列会按照字母顺序重排。有关 Jet Provider 中存在的这一问题的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    299484  (http://support.microsoft.com/kb/299484/EN-US/ ) PRB:使用 ADOX 检索 Access 表的列时,列按字母顺序排列
  • 当 Jet Provider 确定一个 Excel 列包含了混合文本和数值数据时,Jet Provider 会选择“majority”数据类型并将不匹配的值以 NULL 形式返回。有关如何解决这个问题的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    194124  (http://support.microsoft.com/kb/194124/EN-US/ ) PRB:使用 DAO OpenRecordset 时 Excel 返回值为 NULL

 

参考

有关如何将 Excel 用作数据源的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

257819  (http://support.microsoft.com/kb/257819/EN-US/ ) 如何:在 Visual Basic 或 VBA 中使用 ADO 来处理 Excel 数据

有关如何将数据传输到 Excel 中的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

295646  (http://support.microsoft.com/kb/295646/EN-US/ ) 如何:使用 ADO 将数据从 ADO 数据源传输到 Excel
247412  (http://support.microsoft.com/kb/247412/EN-US/ ) INFO:将数据从 Visual Basic 传输到 Excel 的方法
246335  (http://support.microsoft.com/kb/246335/EN-US/ ) 如何:使用“自动化”功能将数据从 ADO 记录集传输到 Excel
319951  (http://support.microsoft.com/kb/319951/EN-US/ ) 如何:通过 SQL Server 数据传输服务向 Excel 传送数据
306125  (http://support.microsoft.com/kb/306125/EN-US/ ) 如何:将数据从 Microsoft SQL Server 导入 Microsoft Excel
posted @ 2010-11-19 11:08  lavandachen  阅读(844)  评论(1编辑  收藏  举报