本文循序漸進(jìn)地演示如何用不同的方法將數據從 Microsoft Excel 工作表導入到 Microsoft SQL Server 數據庫。
技術(shù)說(shuō)明
本文中的示例使用以下工具導入 Excel 數據:
| • | SQL Server 數據傳輸服務(wù) (DTS) |
| • | SQL Server 鏈接服務(wù)器 |
| • | SQL Server 分布式查詢(xún) |
| • | ActiveX 數據對象 (ADO) 和 Microsoft OLE DB Provider for SQL Server |
| • | ADO 和 Microsoft OLE DB Provider for Jet 4.0 |
要求
下面的列表列出了推薦使用的硬件、軟件、網(wǎng)絡(luò )架構以及所需的服務(wù)包:
| • | Microsoft SQL Server 7.0 或 Microsoft SQL Server 2000 的可用實(shí)例 |
| • | Microsoft Visual Basic 6.0(針對使用 Visual Basic 的 ADO 示例) |
本文的部分內容假定您熟悉下列主題:
| • | 數據傳輸服務(wù) |
| • | 鏈接服務(wù)器和分布式查詢(xún) |
| • | Visual Basic 中的 ADO 開(kāi)發(fā) |
示例
導入與追加
本文使用的示例 SQL 語(yǔ)句演示了“創(chuàng )建表”查詢(xún)。該查詢(xún)通過(guò)使用 SELECT...INTO...FROM 語(yǔ)法將 Excel 數據導入新的 SQL Server 表。如這些代碼示例所示,在繼續引用源對象和目標對象時(shí),可以通過(guò)使用 INSERT INTO...SELECT...FROM 語(yǔ)法將這些語(yǔ)句轉換成追加查詢(xún)。
使用 DTS
可以使用 SQL Server 數據傳輸服務(wù) (DTS) 導入向導將 Excel 數據導入 SQL Server 表。在逐步執行向導并選擇 Excel 源表時(shí),要記住附加美元符號 ($) 的 Excel 對象名稱(chēng)代表工作表(例如,Sheet1$),而沒(méi)有美元符號的普通對象名稱(chēng)代表 Excel 指定的范圍。
使用鏈接服務(wù)器
要簡(jiǎn)化查詢(xún),可以將 Excel 工作簿配置為 SQL Server 中的鏈接服務(wù)器。 有關(guān)其他信息,請單擊下面的文章編號,以查看 Microsoft 知識庫中相應的文章:
306397 (http://support.microsoft.com/kb/306397/) 如何結合 SQL Server 鏈接的服務(wù)器和分布式查詢(xún)使用 Excel
下列代碼將 Excel 鏈接服務(wù)器“EXCELLINK”上的 Customers 工作表數據導入新的名為 XLImport1 的 SQL Server 表:
SELECT * INTO XLImport1 FROM EXCELLINK...[Customers$]
還可以通過(guò)按照以下方式使用 OPENQUERY 以全通過(guò)方式對源數據執行查詢(xún): SELECT * INTO XLImport2 FROM OPENQUERY(EXCELLINK, ‘SELECT * FROM [Customers$]‘)
使用分布式查詢(xún)
如果不想將對 Excel 工作簿的永久連接配置為鏈接服務(wù)器,可以通過(guò)使用 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
當通過(guò)使用 Microsoft OLE DB for SQL Server (SQLOLEDB) 在 ADO 應用程序中連接到 SQL Server 時(shí),可以使用與
“使用分布式查詢(xún)” 一節中相同的“分布式查詢(xún)”語(yǔ)法將 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 來(lái)連接到 Excel 源。
Jet 數據引擎可以通過(guò)使用具有三種不同格式的特殊語(yǔ)法來(lái)在 SQL 語(yǔ)句中引用外部數據庫:
| • | [Full path to Microsoft Access database].[Table Name] |
| • | [ISAM Name;ISAM Connection String].[Table Name] |
| • | [ODBC;ODBC Connection String].[Table Name] |
本節使用第三種格式創(chuàng )建到目標 SQL Server 數據庫的 ODBC 連接??梢允褂?ODBC 數據源名稱(chēng) (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>] 下列 Visual Basic 6.0 代碼示例要求添加對 ADO 的項目引用。此代碼示例演示了如何使用 Jet 4.0 Provider 通過(guò) ADO 連接將 Excel 數據導入到 SQL Server。 Dim cn As ADODB.Connection Dim strSQL As String Dim lngRecsAff As Long Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\test\xltestt.xls;" & _ "Extended Properties=Excel 8.0" ‘Import by using Jet Provider. strSQL = "SELECT * INTO [odbc;Driver={SQL Server};" & _ "Server=<server>;Database=<database>;" & _ "UID=<user>;PWD=<password>].XLImport9 " & _ "FROM [Customers$]" Debug.Print strSQL cn.Execute strSQL, lngRecsAff, adExecuteNoRecords Debug.Print "Records affected: " & lngRecsAff cn.Close Set cn = Nothing 也可以通過(guò)使用該語(yǔ)法(Jet Provider 支持)將 Excel 數據導入其他 Microsoft Access 數據庫、索引順序存取方法 (ISAM)(“desktop”)數據庫或 ODBC 數據庫。
疑難解答
| • | 記住附加美元符號 ($) 的 Excel 對象名稱(chēng)代表工作表(例如:Sheet1$),而普通對象名稱(chēng)代表 Excel 指定的范圍。 |
| • | 在某些環(huán)境中,特別是用表名稱(chēng)取代 SELECT 查詢(xún)指派 EXCEL 源數據時(shí),目標 SQL Server 表中的列會(huì )按照字母順序重排。有關(guān) Jet Provider 中存在的這一問(wèn)題的其他信息,請單擊下面的文章編號,以查看 Microsoft 知識庫中相應的文章: 299484 (http://support.microsoft.com/kb/299484/) PRB:使用 ADOX 檢索 Access 表的列時(shí),列按字母順序排列 |
| • | 當 Jet Provider 確定一個(gè) Excel 列包含了混合文本和數值數據時(shí),Jet Provider 會(huì )選擇“majority”數據類(lèi)型并將不匹配的值以 NULL 形式返回。有關(guān)如何解決這個(gè)問(wèn)題的其他信息,請單擊下面的文章編號,以查看 Microsoft 知識庫中相應的文章: 194124 (http://support.microsoft.com/kb/194124/) PRB:使用 DAO OpenRecordset 時(shí) Excel 返回值為 NULL |
有關(guān)如何將 Excel 用作數據源的其他信息,請單擊下面的文章編號,以查看 Microsoft 知識庫中相應的文章:
257819 (http://support.microsoft.com/kb/257819/) 如何在 Visual Basic 或 VBA 中使用 ADO 來(lái)處理 Excel 數據
有關(guān)如何將數據傳輸到 Excel 中的其他信息,請單擊下面的文章編號,以查看 Microsoft 知識庫中相應的文章:
295646 (http://support.microsoft.com/kb/295646/) 如何使用 ADO 將數據從 ADO 數據源傳輸到 Excel
247412 (http://support.microsoft.com/kb/247412/) INFO:將數據從 Visual Basic 傳輸到 Excel 的方法
246335 (http://support.microsoft.com/kb/246335/) 如何使用“自動(dòng)化”功能將數據從 ADO 記錄集傳輸到 Excel
319951 (http://support.microsoft.com/kb/319951/) 如何通過(guò) SQL Server 數據傳輸服務(wù)向 Excel 傳送數據
306125 (http://support.microsoft.com/kb/306125/) 如何將數據從 Microsoft SQL Server 導入 Microsoft Excel