Получить имя листа Excel в SQL Server - PullRequest
3 голосов
/ 16 сентября 2011

Как получить имена листов в файле Excel с помощью SQL Server 2005?

Обратите внимание, что:

  • Нет внешнего интерфейса (C #, VB, PHPи т. д.);
  • Я пытаюсь получить имена листов, используя только SQL Server 2005.

Спасибо.

Ответы [ 2 ]

16 голосов
/ 30 января 2013

Для этого есть как минимум две возможности.Я сразу признаюсь, что у меня нет простого способа проверить это в 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, как описано здесь .Я не пробовал это сам.

2 голосов
/ 16 сентября 2011

Вы не можете. Существует два способа чтения данных из Excel. Одним из них является маршрут COM / OLE Automation , который позволит вам выполнять перечисление по рабочим листам в рабочей книге. Это требует процедурного языка, который TSQL не будет делать. Я даже не думаю, что если вы разрешите использование методов CLR в миксе, вы сможете получить доступ к библиотекам Office, поскольку их нет в списке BCL.

Вторым способом будет использование Jet jet через openquery в этом случае, но как часть настройки, вам необходимо явно определить файл и рабочий лист для доступа. Вы можете отказаться от перечисления названий рабочих листов, но даже в этом случае Excel не предоставляет метаданные о рабочих листах в меру моего гадания.

Я удалю этот ответ, если кто-то знает другой путь, но, рассмотрев эту проблему несколькими способами, я не нашел ответа, который не сводится к одному из двух вышеупомянутых подходов. *

...