2009年11月27日金曜日

SQL-Server 2008 Expressは、再帰クエリーが書けて感動(その1)

今回と、次回の記事は、二回に分けて、マイクロソフトのフリーのデータベース「SQL-Server 2008 Express」の「再帰クエリー」について書かせていただきます。

再帰クエリーは、私が普段仕事で使っているバリバリの企業向けエディションSQL-Server 2000では書けないので、2008 Expressがむちゃくちゃうらやましい。

再帰は、その名前の通り、自分で自分を呼び出す処理です。
たとえばなのですが、一年分のカレンダー情報なんかは、再帰クエリーを使うとすぐに作る事が出来ます
ただ、再帰クエリーを書くには、SQL-Server 2008 の「共通テーブル式(CTE)」という手法を知っておかないとならないので、2000から来た場合は、ワンクッションおいて勉強しないといけないかも。

共通テーブル式CTEは、文の中だけ限定で使えるビューのようなもので、CTEの中では自分自身(CTE)をさらに呼び出せるという特性があり、再帰クエリーはこのCTEの特性を応用することで書けるようになっています。

実際にカレンダー情報を得るクエリーを作ってみました。再帰クエリーは、おおまかに言って三つの部位から成り立っています。まず、CTEの外側にあって、CTEを最初に呼び出す式。
CTEの内部には、処理の起点となるアンカー部。アンカー以降の繰り返し部分となる再帰部
この動きを覚えるには、やはり自分でサンプルを何回も書いてみるのが近道でしょうね。

カレンダー処理ですが、まずはアンカー部にカレンダーの起点を指定します。
再帰部は、日付に1日プラスするだけ。
この再帰部を呼び出し続ける事によって果てしなくカレンダー情報を作る事が出来るわけです。
ただし、このままでは無限に求めてしまうので、CTEの外側の式に「TOP 365」を指定することによって一年分(365日分)で終わらせているわけです。

ちなみに、忘れちゃいけないのですが、再帰クエリーには強制打ち切り機能があるのです。
再帰クエリーは、OPTION(MAXRECURSION 再帰打ち切り回数[0だと無限])というオプションを指定しない限り、強制的に100回で打ち切りになります。
この場合、100回分だけ有効ってわけではなくて、丸ごとエラーとして扱われるのがポイントです。