2009年11月22日日曜日

SQL-Server 2008 Expressでは、待望のマージ(MERGE)文が書ける!

今回の記事は、Aspire 1410のWindows7(64bit)版で稼動するフリーのデータベース「SQL-Server 2008 Express(64bit版)」について書かせて頂きたいと思います。

マイクロソフトのSQL-Server 2008 Expressは、そのGUI管理ツールであるManagement Studio 2008と共に、「えっ、こんなスゴイのがフリーでいいの?!」と、本気でマイクロソフトが心配になるほどの驚異的な使いやすさと高機能を誇っているすさまじいソフトです。

なんたって、フリーとはいえ、その基本として備わっている機能は、企業が基幹システムに採用する製品版と同等

ただし、製品版と比較して、使用できるメモリ量とCPU数などに上限が設けられており、大規模なデータを扱いきれなくする事によって、企業がフリーで済ませられないような制約はかけてありますそりゃ当たり前ですね。

SQL-Server 2008は、特にSQL-Server 2000からは、劇的と言えるほどの進化をとげております。
進化点はさまざまありますが、二つのテーブルを一つにマージするMERGE文がようやく書けるようになっています。今回の記事は、特にこの部分フォーカスしております。

MERGE文が無いと結構大変。テーブル1とテーブル2を比較し、キーが重複すれば更新、しなければ挿入という文をバラバラに書かねばならないし、それぞれ何件処理したかの管理も考えないといけません。しかし、MERGE文なら一発
うわぁ・・・これは良いわー・・・。

というわけで、MERGEのクエリーを書いてみました。
せっかくなので、使用するデータはExcelから読み込んでみました。Excelからデータを読み込む周りは、以前の記事で書かせて頂いた内容をそのまま応用いたしました。

MARGE文で二つのテーブルを一つにするだけでもありがたいですが、その更新内容を出力するOUTPUT句の存在もかなり大きいものがあります。
どの行を更新し、どの行を挿入したのか、自分で処理を作り込む必要がなく、$actionを参照しさえすれば「UPDATE」または「INSERT」というテキストでもって、システムが行った更新内容を報告してくれるんです。
これは、SQL-Server 2000なんかを使った後だとかなり感動できちゃいますね。

ちなみに、SQL-Server 2008は、ビューやSQL関数だけでなく、共通テーブル式(CTE)という書き方が使えます。共通テーブル式は、どうやらパフォーマンスも落ちないらしい
せっかくなので、CTEも無理やりに使ってみました・・・。