Ext JS に関しては,新しい記事は Sunvisor Lab. ExtJS 別館 にあります。そちらもよろしくお願いいたします。
SQL Server で文字列の半角/全角変換
SQL Server 2005 のサーバー側の関数で,文字列の半角/全角変換をしたいとずっと思っていました。ネットでググると,「SQL Server にはその機能がないので,REPLACE関数を羅列して解決するしかない」という記事(データの全角半角変換、、 - Database Expert - @IT)に当たり,そのコードを実装した記事(SQLServerでの文字列の半角文字から全角文字への変換)に当たりました。確かにT-SQLで実装しようとすると,その方法しかないでしょう。しかし,あまりにあまりな力業(^^;
一方,SQL Server 2005 からはSQLCLRというのが使えるはずです。それを使えばVB.NETで書いた関数を,サーバーサイドの関数にできるはず。AccessのMDBを使っている場合には,クエリの中でAccess VBAの関数を使えるので,StrConv関数を使って簡単に実現できていました。StrConvは.NETでも使えます。SQLCLRを一度やってみたいと思いながら手をつけずにいたので,いっちょ挑戦してみるかという気分になりました。そう思ってさらにググってみると,次の記事を発見しました。
ノラの日々 : SQL CLRでSTRCONV関数
この記事がまさに私の求めていたものです。さっそくマネマネすることにしました。
SQLCLR構成オプションの有効化
まず,SQLCLRを使えるようにする必要があります。その方法は「SQL Server 自習書 開発編 No.3 SQLCLR」に載っていますが,簡単に説明すると次の手順です。
- 全てのプログラム > Microsoft SQL Server 2005 > 構成ツール > SQL Server セキュリティ構成を実行。
- 「機能のセキュリティ構成」をクリック。
- ツリーの中から「データベースエンジン」を展開して「CLR統合」をクリック。
- 「CLR統合を有効にする」のチェックを入れて「適用」ボタンをクリック。
DLLの作成
次にVBで書いたプログラムソースを入力します。先ほどのサイトに掲載されていたVBのソース部分です。
Imports System Imports System.Data Imports System.Data.SqlClient Imports System.Data.SqlTypes Imports Microsoft.SqlServer.Server Public Class SQLCLR <Microsoft.SqlServer.Server.SqlFunction()> _ Public Shared Function SqlStrConv(ByVal str As SqlString, ByVal mode As SqlInt32) As SqlString Return StrConv(str.ToString, mode) End Function End Class
このプログラムをSqlClrStrConv.vbというファイル名で作成します。ここでは C:\CLRLib というフォルダに作成することにします。次にコマンドプロンプトを起動してC:\CLRLibに行きます。なお,ここでの手順ではこれらの作業はサーバー上で行います。
C:\>CD CLRLib
私の環境ではVBコンパイラ(VBC.exe)にパスが通っていませんでしたので,そこにパスを通します。.NET 2.0のコンパイラを使う必要があるようです。
C:\CLRLib>PATH C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\;%PATH%
パスはお使いの環境に合わせてくださいね。これでコンパイルの準備ができましたので,コンパイルします。
C:\CLRLib>vbc /out:SqlClrStrConv.dll /t:library /r:"C:\Program Files\Microsoft S QL Server\MSSQL.1\MSSQL\Binn\sqlaccess.dll" SqlClrStrConv.vb
エラーなくコンパイルができたら,SqlClrStrConv.dllができていると思います。
ストアド関数の作成
次に,関数を作成するSQL文を実行します。関数を作成したいデータベースに対して実行してください。SQL Server Management Studio の場合は次のように
CREATE ASSEMBLY [SqlClrStrConv] FROM 'C:\CLRLib\SqlClrStrConv.dll' WITH PERMISSION_SET = SAFE GO CREATE FUNCTION SqlStrConv( @str nvarchar(max),@conversion int ) returns nvarchar(max) AS EXTERNAL NAME SqlClrStrConv.SQLCLR.SqlStrConv GO
僕の好きなA5:SQLだと次のような感じで ; コロンで終了して,「すべてを順に」で実行します。
CREATE ASSEMBLY [SqlClrStrConv] FROM 'C:\CLRLib\SqlClrStrConv.dll' WITH PERMISSION_SET = SAFE; CREATE FUNCTION SqlStrConv( @str nvarchar(max),@conversion int ) returns nvarchar(max) AS EXTERNAL NAME SqlClrStrConv.SQLCLR.SqlStrConv;
同じサーバー上の他のデータベースで利用したい場合は,そのデータベースで上記のSQLを実行すれば使えるようになります。
関数を使う
実際にSQLで変換をするには次のようにします。
半角に変換
SELECT dbo.SqlStrConv(NameKana, 8) FROM tblPersons
全角に変換
SELECT dbo.SqlStrConv(NameKana, 4) FROM tblPersons
第二引数の値はVbStrConv 列挙型ですが,数値に直すとほぼVBAと同じです。
定数 | 値 | 内容 |
---|---|---|
vbUpperCase | 1 | 文字列を大文字に変換します。 |
vbLowerCase | 2 | 文字列を小文字に変換します。 |
vbProperCase | 3 | 文字列の各単語の先頭の文字を大文字に変換します。 |
vbWide* | 4* | 文字列内の半角文字 (1 バイト) を全角文字 (2 バイト) に変換します。 |
vbNarrow* | 8* | 文字列内の全角文字 (2 バイト) を半角文字 (1 バイト) に変換します。 |
vbKatakana** | 16** | 文字列内のひらがなをカタカナに変換します。 |
vbHiragana** | 32 | 文字列内のカタカナをひらがなに変換します。 |
vbUnicode | 64 | システムの既定のコード ページを使って文字列を Unicode に変換します。Macintosh. では使用できません) |
vbFromUnicode | 128 | 文字列を Unicode からシステムの既定のコード ページに変換します。Macintosh. では使用できません) |
でも.NETのStrConvは,なんだか簡体字/繁体字の変換までできるみたいですね。
見てた人いたんですね
http://nora1962.exblog.jp/
「ノラの日々」作者でーす。
私の記事を参考になさっている方がいるとは存じませんでした。ありがとうございます。
ちなみに、
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Public Class RegxReplace
<Microsoft.SqlServer.Server.SqlFunction()> _
Public Shared Function RegxReplace(s As SqlString,r As SqlString,d As SqlString ) As SqlString
Dim source As String = s.ToString()
Dim regx As System.Text.RegularExpressions.Regex = New System.Text.RegularExpressions.Regex(r)
Dim ret As SqlString = new SqlString(regx.Replace(source, d.ToString()))
Return ret
End Function
End Class
というのも作ってみました。
ところが、CREATE ASSEMBLYが通りません。いろいろ調べてみたら、.Net Framwork 4.0ではSQL Server2005,2008に登録できないそうです。M$さん、そりゃないでしょという感じ。ほぼ、一日費やしてしまいましたよ。