2010年4月21日水曜日

SQL-Server 2008 Expressで、正規表現で文字列のパターン判定をする関数をSQLCLRで作ってみる(2)




今回の記事は、先日書かせていただいた、「SQL-Server 2008 Expressで、正規表現で文字列のパターン判定をする関数をSQLCLRで作ってみる」の続編です。

前回は、SQL-Server 2008 Expressにおいて、正規表現を使った文字列検索をする関数を作りましたが、nullのデータが入ってくるとエラーになってしまいます
それを回避するバージョンを作ってみました。

正規表現をlikeと同じ使い勝手で利用できるようになると、仕事でもプライベートでも、とにかく分析作業などは段違いに効率が良くなります。
また、SQL-Serverならではといいましょうが、条件を複数に書き分けて、肯定と否定を織り交ぜた複雑な条件もさくさく書く事が出来るわけです。

正規表現は、本当に強力です。

■使用例■

--先頭が数字で始まるゲーム名。
--しかし、末尾は数字では終わらない。


SELECT
GAME_NAME
FROM #T_GAME
WHERE dbo.SQLCLR_Regex(GAME_NAME,'^\d+') = 1 --肯定と
AND dbo.SQLCLR_Regex(GAME_NAME,'\d+$') = 0 --否定の組み合わせ


■コード■
(インデントは消えています)
(無償版のVisual C# 2008でプログラムを書けます)

//------------------------------------
//正規表現による文字列パターン判定
//------------------------------------
//using System.Text.RegularExpressions;を記述して下さい。
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlBoolean SQLCLR_Regex(
SqlString p_value,
SqlString p_pat
)
{
//正規表現
Regex obj_rx;
//結果格納エリア
SqlBoolean Qbol_result = false;
try
{
//SQL-ServerからNULLが来ない時に処理する。
if (!(p_value.Equals(SqlString.Null)))
{
obj_rx = new Regex((string)p_pat);
if (obj_rx.IsMatch((string)p_value))
{
Qbol_result = true;
}
}
}
catch (System.Exception obj_err)
{ //例外が発生したらSQL-Serverに投げつけて強制停止する。
throw obj_err;
}

return Qbol_result;
}