Sql Server 讀取excel方法:
select * from OPENROWSET
('Microsoft.Jet.OLEDB.4.0',
'Excel 8.0;Database=存放Excel\Excel名.xls',[Sheet名$])
Example:
select * from OPENROWSET
('Microsoft.Jet.OLEDB.4.0',
'Excel 8.0;IMEX=1;Database=f:\SuccessBak\Student.xls',
[Class$])
--注意:
--1.excel處於關閉狀態,即不能處於被打開狀態
--2.excel文件所處路徑及文件名、工作簿的名稱盡量不要出現漢字,盡量以英文命名
--3.注意[Class$]',工作簿名后的$是必須的.
--4.Excle必須與Sql Server在同一電腦上。
在使用這個sql語句的過程中,我們可能會碰到下面的錯誤
SQL Server blocked access to STATEMENT 'OpenRowset/OpenDatasource' of component 'Ad Hoc Distributed Queries' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Ad Hoc Distributed Queries' by using sp_configure. For more information about enabling 'Ad Hoc Distributed Queries', see "Surface Area Configuration" in SQL Server Books Online
sqlserver 阻止了使用'OpenRowset/OpenDatasource'的組件,所以解決辦法如下:
我們使用sql語句來開啟這個功能
EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'Ad Hoc Distributed Queries', 1;
GO
RECONFIGURE;
GO
如果遇到以下問題,請檢查文章開始處提到的注意:
服務器: 消息 7399,級別 16,狀態 1,行 1
OLE DB 提供程序 'Microsoft.Jet.OLEDB.4.0' 報錯。提供程序未給出有關錯誤的任何信息。
OLE DB 錯誤跟蹤[OLE/DB Provider 'Microsoft.Jet.OLEDB.4.0' IDBInitialize::Initialize returned 0x80004005: 提供程序未給出有關錯誤的任何信息。]。
補充:
讀取Excel時,可能會遇到以下問題:
當列中存在數字行和字符串行時,會遇到有一種讀出為null的情況,該如何處理呢?
1、在數字行的數據前加';
2、在連接字符串中加入:IMEX=1;
但是第二種方法有時還不行.當前八行數據均為數字或字符串時,后面再有其他類型數據時,仍然讀不出來 。
解釋如下:
IMEX是用來告訴驅動程序使用Excel文件的模式,其值有0、1、2三種,分別代表導出、導入、混合模式。當我們設置IMEX=1時將強制混合數據轉換為文本,
但僅僅這種設置並不可靠,IMEX=1只確保在某列前8行數據至少有一個是文本項的時候才起作用,它只是把查找前8行數據中數據類型占優選擇的行為作了
略微的改變。例如某列前8行數據全為純數字,那么它仍然以數字類型作為該列的數據類型,隨后行里的含有文本的數據仍然變空。
另一個改進的措施是IMEX=1與注冊表值TypeGuessRows配合使用,TypeGuessRows 值決定了ISAM 驅動程序從前幾條數據采樣確定數據類型,
默認為“8”。可以通過修改“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel”下的該注冊表值來更改采樣行數。
但是這種改進還是沒有根本上解決問題,即使我們把IMEX設為“1”, TypeGuessRows設得再大,例如1000,假設數據表有1001行,
某列前1000行全為純數字,該列的第1001行又是一個文本,ISAM驅動的這種機制還是讓這列的數據變成空。