SQL Server OPENROWSET 関数で Excel 2007 ファイル(.xlsx ファイル)を参照するには

SQL Server では、OPENROWSET 関数を利用すると、Excel 2007 のファイル(.xlsx ファイル)を参照することもできます。これは次のように利用します。これは利用するには、下記サイトから「2007 Office system ドライバ」をダウンロードして、インストールしておきます。


2007 Office system ドライバ: データ接続コンポーネント
http://www.microsoft.com/downloads/details.aspx?FamilyId=7554F536-8C28-4598-9B72-EF94E038C891&displaylang=ja


OPENROWSET 関数では、Access 2007 のときと同じプロバイダ「Microsoft.ACE.OLEDB.12.0」を指定して、次のように記述します。

-- アドホック クエリの有効化
EXEC sp_configure 'show advanced options', 1
RECONFIGURE 
EXEC sp_configure 'Ad Hoc Distributed Queries', 1
RECONFIGURE

-- OPENROWSET 関数で、Shohin.xlsx ファイルの Sheet1 を参照
SELECT * FROM
 OPENROWSET('Microsoft.ACE.OLEDB.12.0'
    , 'Excel 12.0;Database=C:\Shohin.xlsx;'
    , 'SELECT * FROM [Sheet1$]')

-- アドホック クエリの無効化
EXEC sp_configure 'Ad Hoc Distributed Queries', 0
EXEC sp_configure 'show advanced options', 0
RECONFIGURE

Excel 2007 の場合も、Access 2007 のときと同じプロバイダ(Microsoft.ACE.OLEDB.12.0)を指定し、「Excel 12.0;Database=xlsx ファイル名」と記述します。
なお、次のエラーが表示された場合は

メッセージ 7399、レベル 16、状態 1、行 1
リンク サーバー "(null)" の OLE DB プロバイダ "Microsoft.ACE.OLEDB.12.0" により、
エラーがレポートされました。アクセスが拒否されました。
メッセージ 7350、レベル 16、状態 2、行 1
リンク サーバー "(null)" の OLE DB プロバイダ "Microsoft.ACE.OLEDB.12.0" から
列情報を取得できません。

以下を実行することで解決できます(実行後、OS の再起動が必要な場合があります)。

USE master
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0' , N'AllowInProcess' , 1
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0' , N'DynamicParameters' , 1

これにより、以下のレジストリが設定されます。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10.インスタンス名\Providers\Microsoft.ACE.OLEDB.12.0<参考 URL>
Microsoft.ACE.oledb.12.0 linked server "(null)" reported an error. Access denied
http://social.msdn.microsoft.com/Forums/en-US/sqldataaccess/thread/bb2dc720-f8f9-4b93-b5d1-cfb4f8a8b1cb


OPENROWSET 関数は、Express Edition でも利用できます(Express Edition では Integration Services を利用できないので、この関数が役立ちます)。
OPENROWSET の詳細(ヘルプ)はこちらから
http://msdn.microsoft.com/ja-jp/library/ms190312.aspx


なお、何度も同じ .xlsx ファイルをクエリする場合には、リンク サーバーを作成しておくと便利です。