2009年12月8日火曜日

SQL CLRで、JANコードのチェックデジットを算出する関数を作る

今回の記事も、SQL-Server 2008 Expressの関数(C#言語で作った関数=SQL CLR)について書かせて頂きたいと思います。

今回は、バーコードのチェックデジットを算出するスカラ型関数です。

よく、商品のパッケージなどにバーコードが印刷されていますけれど、あれは多くがJANコードと呼ばれる種類のバーコードで、13桁もしくは8桁の数字で構成されております。
あの数字は、ただ並べられているだけはありません。
特にその最後の一桁の数字は、チェックデジットと言って、「モジュラス10ウェイト3」という計算方法で算出された暗号となっています。
暗号と一致しない数列は無効となってバーコードリーダーなどの機器で読み取る事が出来ない仕組みになっているのです。
チェックデジットの算出は物流系の仕事をやるのなら、必須知識だったりします。
今回の関数(SQL CLR)は、そのチェックデジットを算出するものです。

一応、JANコードのチェックデジットという事にしていますが、今回作った関数は、求めたいコードの桁数に制限を入れていません。オーバーフローするまで何桁でもOKです。

手入力で
SELECT SPDB.dbo.SLQCLR_GetCd(498704520564,0);
と入力すると、コード498704520564のチェックデジットである4が算出されます。

でも本来の目的は、チェックデジットを求めたい数列を大量にテーブルに格納しておいて、全行のチェックデジットを一発で求めるというやり方です。
このようなやり方においては、SQL CLRの処理速度の速さが決定的に効いて来ますね。

試しに30万件程度のテストデータを作って回してみた所、純粋にTransact SQLで作った関数でやってみたら結果が出るまでに50秒かかったところ、SQL CLRでは、なんとたった4秒で結果が表示されました。

やはりSQL CLRのパフォーマンスは高いですし、C#言語でプログラムが組めるメリットはあまりにも大きいものがありますね。

しかし、最近、帰宅してからというもの、SQL-Server 2008 Expressにハマリまくってます・・・。
買ったばかりのAspire 1410のキーボードですが、打ち過ぎて?? 早くもキートップがテカテカして来てしまった。うう・・・やだなー。
ちなみに、せっかく買ったPSP等のゲームが全くプレイしないまま積み上がっているので、もうしばらく新作ソフトは買わないようにしようかな。