2011-09-16 23 views
3

SQL Sever 2005を使用してExcelファイルでシート名を取得する方法は?SQL ServerでExcelシート名を取得

ことに注意してください:

  • は何のフロントエンド(Cの#、VB、PHPなど)がありません。
  • SQL Server 2005だけを使用してシート名を取得しようとしています。

ありがとうございます。

答えて

2

できません。 Excelからデータを読み取るには2つのルートがあります。 1つはCOM/OLE automationルートで、ワークブック内のワークシートを列挙できます。それはTSQLがしない手続き型言語を必要とします。私は、あなたがBCLリストに載っていないので、あなたがミックスにCLRメソッドを許可すれば、あなたはOfficeライブラリにアクセスすることができると思います。

第2のルートは、この場合にはオープンクエリを介してJet driverを使用することですが、セットアップの一部として、アクセスするファイルとワークシートを明示的に定義する必要があります。あなたはワークシート名の記載を忘れることができますが、それでもExcelはワークシートに関するメタデータを私の占いの中で公開しません。

誰かが別の方法を知っているにもかかわらず、この問題をさまざまな方法でスライスしていたら、私は前述の2つのアプローチのいずれかに沸かない答えを出していません。

+0

CLRメソッドを検討しています...まだいくつかの調査と研究を行う必要があります。ありがとう。 – Temp

+0

@billinkc、これは明らかに古くなっていますが、私は1つまたは2つの方法に遭遇した可能性があります。 –

11

これには少なくとも2つの可能性があります。 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 Automation Proceduresを使用してください。here。私は自分自身でこれを試していない。

関連する問題