4

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

请注意:

  • 没有前端(C#、VB、PHP等);
  • 我试图仅使用 SQL Server 2005 来获取工作表名称。

谢谢。

4

3 回答 3

20

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

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

我在这里找到了灵感。

2 :使用此处概述的 Ole 自动化程序。我自己没有试过这个。

于 2013-01-29T23:02:58.147 回答
1

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

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

如果有人知道另一种方式,但我会删除这个答案,但已经以多种方式解决了这个问题,我还没有想出一个不能归结为上述两种方法之一的答案。

于 2011-09-16T01:27:54.970 回答
0

只是从蒂姆的回答中充实选项 2 - Ole 自动化程序,因为它的链接现在已经死了。您可以使用如下代码执行此操作:

declare @FilePath varchar(max) = '[Excel File].xlsx'
declare @ConnectionString varchar(max) = 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source='+@FilePath+';Extended Properties=''Excel 12.0;HDR=Yes'''
declare @r int, @objConnection int, @objRecordSet int
          exec @r = sp_OACreate 'ADODB.Connection', @objConnection output
if @r = 0 exec @r = sp_OAMethod @objConnection, 'Open', null, @connectionstring
if @r = 0 exec @r = sp_OAMethod @objConnection, 'OpenSchema', @objRecordSet output, 20
if @r = 0 exec @r = sp_OAGetProperty @objRecordSet, 'GetRows'
于 2021-08-05T03:30:53.737 回答