【发布时间】:2011-09-16 00:51:04
【问题描述】:
如何使用 SQL Sever 2005 获取 Excel 文件中的工作表名称?
请注意:
- 没有前端(C#、VB、PHP等);
- 我正在尝试仅使用 SQL Server 2005 来获取工作表名称。
谢谢。
【问题讨论】:
标签: sql-server excel sql-server-2005 worksheet
如何使用 SQL Sever 2005 获取 Excel 文件中的工作表名称?
请注意:
谢谢。
【问题讨论】:
标签: sql-server excel sql-server-2005 worksheet
这样做至少有两种可能性。我事先承认,我没有简单的方法在 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
我找到了这个here的灵感。
2:使用here 概述的 Ole 自动化程序。这个我自己没试过。
【讨论】:
你不能。从 Excel 读取数据有两种途径。一种是COM/OLE automation 路由,它允许您枚举工作簿中的工作表。这需要一种 TSQL 不会做的过程语言。我什至不认为如果您允许 CLR 方法混合使用,您将能够访问 Office 库,因为它们不在 BCL 列表中。
在这种情况下,第二种方法是通过 openquery 使用Jet driver,但作为设置的一部分,您需要明确定义要访问的文件和工作表。您可以放弃列出工作表名称,但即便如此,Excel 也不会根据我的猜测公开有关工作表的元数据。
如果有人知道另一种方法,但我以多种方式解决了这个问题,我将删除这个答案,我没有想出一个不归结为上述两种方法之一的答案。
【讨论】:
从蒂姆的回答中充实选项 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'
【讨论】: