2010年5月1日土曜日

ついに、64bit版 SQL-Server 2008 Expressにおいて、Excelワークシートを直接テーブルとして読み込む事が出来るようになりましたぁ!!





うわぁっ!! や、や、やったぁっ!! 出来たぁ!!
皆さん、ついにこの時がやってまいりましたよ!!
ついに、64bit版Windows 7と、64bit版SQL-Server 2008 Expressにおいて、Excelのワークシートを直接テーブルとして読み込む事が可能となりました!!

SQL-Serverは、とてつもなくスゴイやつでして、OpenRowset()関数やリンクサーバーなどを使う事により、Excelワークシートを直接テーブルとして扱えるという必殺技があるのですが、64bit環境ではだめでした・・・。
それは、キーパーソンとなる「Microsoft.JET.OLEDB.4.0」というプロバイダが64bit非対応である事がその原因です。このため、過去の記事でも、Excelを使うため色々苦しみました
過去の記事を読み返してみると・・・Aspire 1410から、32bitシステムの自作PCに接続して、遠隔でExcel読ませるとか・・・相当な無茶苦茶やってましたねぇ・・・。プライベート利用だからこそ許される荒業ですよ。

このほど、ついにマイクロソフトが64bit対応プロバイダを公開してくれました。
まだベータ版なのですが、そんな事言ったってもう使う以外の選択肢はありません

ただし、Microsoft.JET.OLEDB.4.0ではなくて、Microsoft.ACE.OLEDB.12.0になるので注意が必要です。
それともう一つ。MS-Accessの古いバージョンのエンジンがインストールされていると、削除を求められます。

そんなこんなでインストールが済むと、SQL-Server 2008 Expressに、Microsoft.ACE.OLEDB.12.0プロバイダが登録されました

Excelといっても、無償版のOpenOffice 3.2のCalcでワークシートを作る事が出来るので、ExcelプリインストールモデルじゃないAspire 1410の私でも全然問題ないです。
Calcでテストデータ作って、Excel形式でセーブ。

さて、いよいよSQL-Server 2008からクエリーを発行する時がやって来た。

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 8.0;DATABASE=C:\TEST\TEST.XLS;IMEX=1;HDR=YES;', 'SELECT * FROM [Sheet1$]') AS M;

(追記) 上記のクエリーだと、ワークシートにヘッダー行が無いため、データの一行目がHDR=YESでヘッダーになっちゃいますね。 HDR=NOにして、ヘッダーは自前で用意しようとすると以下のようなクエリーになりますね。
SELECT
F1 as [Game_ID],

F2 as [Game_Name]
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 8.0;DATABASE=C:\TEST\TEST.XLS;IMEX=1;HDR=NO;',
'SELECT * FROM [Sheet1$]') AS M;


おお・・・。うまく出た・・・。今までの苦労よ、さようなら!!
ありがとう、マイクロソフト。
マジに涙が出そう。
まさにゴールデンウィーク!!