获取Excel工作表名称在SQL Server中

如何使用SQL Sever 2005获取Excel文件中的表格名称?

请注意:

  • 没有前端(C#,VB,PHP等);
  • 我试图获取表单名称,但只使用SQL Server 2005。

谢谢。

你不能。 从Excel中读取数据有两条途径。 一个是COM / OLE自动化路线,它允许你枚举工作簿中的工作表。 这需要一个TSQL不会做的程序语言。 我甚至不认为如果你允许使用CLR方法,你可以访问Office库,因为它们不在BCL列表中。

第二种方法是在这种情况下通过openquery使用Jet驱动程序 ,但作为设置的一部分,您需要明确定义要访问的文件和工作表。 您可以放弃列出工作表名称,但即使如此,Excel也不会公开有关工作表的元数据。

我会删除这个答案,如果有人知道另一种方式,但以多种方式切入这个问题,我还没有拿出一个答案,不归结为上述两种方法之一。

这样做至less有两种可能性。 我会承认,我没有一个简单的方法来检查SQL Server 2005,现在只有2008年。

1 :创build链接服务器并使用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 

我在这里find了灵感。

2 :使用这里列出的Ole自动化程序。 我自己没有尝试过这个。