2011-09-16 77 views
3

如何獲得工作表名稱中使用SQL Sever的2005年Excel文件?獲取Excel工作表名稱在SQL Server

請注意的是:

  • 沒有前端(C#,VB,PHP等);
  • 我試圖讓使用無非是SQL Server 2005中單獨工作表名稱。

感謝。

回答

2

你不能。有兩種途徑可以從Excel讀取數據。一種是COM/OLE automation路線,它可以讓你枚舉工作簿中的工作表。這需要TSQL不會執行的程序語言。我甚至不認爲你是否允許使用CLR方法,你可以訪問Office庫,因爲它們不在BCL列表中。

第二條路線是在這種情況下通過openquery使用Jet driver,但作爲設置的一部分,您需要明確定義要訪問的文件和工作表。您可以放棄列出工作表名稱,但即使如此,Excel也不會將工作表的元數據暴露給我的占卜。

如果有人知道的另一種方式,但已經在切片多種方式這個問題,我會刪除這個答案,我還沒有想出了不歸結爲上述兩種方法中的一種答案。

+0

我正在考慮CLR方法...雖然我仍然需要做一些進一步的探討和研究。謝謝。 – Temp

+0

@billinkc,這顯然很古老,但我想我可能偶然發現了一兩種方法。 –

11

至少有兩種可能這樣做。我會承認,我沒有一個簡單的方法來檢查SQL Server 2005,現在只有2008年。

:創建一個鏈接的服務器,並使用sp_tables_ex和/或sp_columns_ex

-- Get table (worksheet) or column (field) listings from an excel spreadsheet 

-- SET THESE! 
declare @linkedServerName sysname = 'TempExcelSpreadsheet' 
declare @excelFileUrl nvarchar(1000) = 'c:\MySpreadsheet.xls' 
-- /SET 

-- Remove existing linked server (if necessary) 
if exists(select null from sys.servers where name = @linkedServerName) begin 
    exec sp_dropserver @server = @linkedServerName, @droplogins = 'droplogins' 
end 

-- Add the linked server 
-- ACE 12.0 seems to work for both xsl and xslx, though some might prefer the older JET provider 
exec sp_addlinkedserver 
    @server = @linkedServerName, 
    @srvproduct = 'ACE 12.0', 
    @provider = 'Microsoft.ACE.OLEDB.12.0', 
    @datasrc = @excelFileUrl, 
    @provstr = 'Excel 12.0;HDR=Yes' 

-- Grab the current user to use as a remote login 
declare @suser_sname nvarchar(256) = suser_sname() 

-- Add the current user as a login 
exec sp_addlinkedsrvlogin 
    @rmtsrvname = @linkedServerName, 
    @useself = 'false', 
    @locallogin = @suser_sname, 
    @rmtuser = null, 
    @rmtpassword = null 

-- Return the table/column info 
exec sp_tables_ex @linkedServerName 
exec sp_columns_ex @linkedServerName 

-- Remove temp linked server 
if exists(select null from sys.servers where name = @linkedServerName) begin 
    exec sp_dropserver @server = @linkedServerName, @droplogins = 'droplogins' 
end 

我找到了靈感這個here

:使用OLE自動化過程所概述here。我自己沒有嘗試過這個。