TOPサーバ構築・運用> 文字関数をCLRで作成
Vista&データベース
Windows Vistaで発生するデータベーストラブル対応指南

第3回:Microsoft SQL Server 2005で必要な対処(後編)

著者:一志 達也   2007/7/20
前のページ  1  2  3
文字関数をCLRで作成

   照合順序の変更を要する検索処理の問題よりも、頭を悩ませることとなりそうなのは、lenやrightなどの文字列処理を行う関数の対処だ。この対処について、マイクロソフトでは「SQL Server 2005におけるJIS2004対応に関するガイドライン」の中で、ユーザが独自にCLRを使った関数を実装するように示している。
SQL Server 2005におけるJIS2004対応に関するガイドライン
http://go.microsoft.com/?linkid=7003958

   ご承知のとおりSQL Server 2005では.NETを使って、ユーザ定義関数を作成し呼び出せるようになっている。CLRとはCommon Language Runtimeの略称で、.NETプログラムの実行環境を意味する。つまりサロゲートペアを正しく扱える文字列関数を.NETで実装して、そちらを使ってほしいというのだ。

   先のガイドラインにあるように、マイクロソフトではそのサンプルを用意していて、len_sやright_sのように語尾に「_s」がついた関数を実装する方法を紹介している。たしかに、このサンプルに従って関数を実装し、それを使って文字列処理を行えば正しい結果を得られた。

   しかし気になるのが、これはあくまでもサンプルとして提供されている点だ。マイクロソフトが製品として出荷しているものではないから、何らかの問題が生じてもサポートを要求できないのである。またいかにも場当たり的な対処に見えてしまう。本来であれば、Service Packなどの形でパッチを提供し、元々の関数の方を変更するべきであろう。当然、時間が経てばそうなるのではないか、と考えるのが普通ではないだろうか。

   そうなると、いまの時点でサンプルに従って自己責任の中で関数を実装し、アプリケーションを変更し、膨大なテストを実行しても無駄になるかもしれない。Service Packで対処されたとなれば、元々の関数を使うようにアプリケーションを再度修正しなくてはならないかもしれないからだ。


まとめ:SQL ServerでJIS X 0213:2004に対応するには

   少し長くなってしまったから、SQL Server 2005でJIS X 0213:2004に対応するための手法について、もう一度まとめておくことにしよう。

  1. データ型はnvarchar/nchar/ntextなど、先頭に「n」が付いたデータ型を使う
  2. 文字列の先頭には大文字のNを付ける(Nプレフィックス)
  3. 照合順序にはJapanese_90_BIN2などを指定する
  4. len_s,right_s,left_sなどユーザ独自関数を実装して使う

表1:SQL Server 2005でJIS X 0213:2004に対応するための手法

   以上のように、SQL Serverを使ったアプリケーションをJIS X 0213:2004に対応させようとするとアプリケーション側の変更は避けられない。TempDBを使っている場合には、照合順序の変更のために、SQL Serverの再インストールということにもなるだろう。さらには、自己責任での関数作成と運用まで必要となり、開発者の負担はあまりに大きい。

   単にプログラム内の文字列置換えではないかと思った方はシステムの品質保証について考え直した方が良い。アプリケーションのコードに変更を加えたら、システム全体の再テストを行わないと品質の保証なんてあったものではないだろう。しかも今回のケースでは様々な文字列でのテストも求められることからも、テストケースは実に複雑なものになるのを避けられないのである。

   次回はOracle DatabaseとオープンソースのMySQLについて、同様の実験を行って対処方法を明らかにする。

前のページ  1  2  3


一志 達也
著者プロフィール
一志 達也
SI企業において、アプリケーション開発や、データベースを中心としたインフラを担当。開発者向け、初心者向けの講座を得意とする。著書に「やさしいOracle PL/SQL入門」「Oracle10g 真剣勝負」などがある。


INDEX
第3回:Microsoft SQL Server 2005で必要な対処(後編)
  実験2:曖昧検索を正しくできるかやってみる
  実験3:文字の長さを正しく計測できるかやってみる
文字関数をCLRで作成