2009年12月21日月曜日

SQL CLRがあれば、SQL-Serverで自由に正規表現を扱える!!

今回の記事は、SQL-Server 2008 における正規化表現の使用について書かせていただきます。

SQL-Serverにおいて、「文字列を検索する際に、望みの検索パターンにヒットしたデータだけを抽出したいなぁ」と思ったら、条件式にlikeを使用するのが一般的かと思います。
likeは良いのですが、とにかく指定出来る検索パターンが少ないのが弱み。

そこで、正規化表現を使いたくなるわけですが、一番の早道はSQL CLR関数を自作してしまう事ではないかと思います。
なぜならば、.NET Frameworkライブラリには、そのものずばりの正規化表現を取り扱うクラス「Regex」があるからです。
また、プログラマブルの長所として、likeのように単にヒットしたかしないかだけを判断するだけでなく、ヒットしたのならば、そのヒットした文字列を全て抽出するような造りにする事も容易です。

今回の記事で作ってみた「SQLCLR_GetLike()」関数は、正規化パターンにヒットした文字列を、CSV形式で全て並べて取得し、ヒットしなければnullを返すようになっています。
例外が発生した場合は、例外オブジェクトをSQL-Serverに投げつけて(throw)、実行をクラッシュさせて強制的にストップさせます。

ただ、likeのように、ヒットしたかしないかだけを判断出来れば良いという場合に備えて、より高速に実行できるSQLCLR_Like()関数も作ってみました。
いちいちヒットした文字列を返そうとしないので、場合によっては二倍くらい高速にはなるはずです。

正規化表現といっても、いつでも複雑な検索パターンを指定しなければならないというわけでもなく、likeで指定するよりもずっとシンプルな検索パターンを書く事も可能です。

正規化表現に限らず、とにかくSQL CLRは、SQL-Serverの必殺技ですね。
SQL CLRさえあれば、SQL-Serverに存在していない機能や不足している機能あれば、とにかく自分で作ってしまって解決してしまえるわけで、その威力はまさに天井知らずと言って良いのではないでしょうか。


私は全てフリーソフト版のSQL-Server 2008 Express(64bit)でやってるわけですが、企業向けの高額エディションに限定せずに(その代わり手動部分が多いですが)サポートしてくれたマイクロソフトには、本当に感謝感激であります。

SQL-Server 2000では、まだまだ機能不足な感が否めなかったですが、2008になったらもう文句なしですね。SQL CLRもあるし、本当にSQL-Serverが好きになりまくりです