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」に載っていますが,簡単に説明すると次の手順です。

  1. 全てのプログラム > Microsoft SQL Server 2005 > 構成ツール > SQL Server セキュリティ構成を実行。
  2. 「機能のセキュリティ構成」をクリック。
  3. ツリーの中から「データベースエンジン」を展開して「CLR統合」をクリック。
  4. 「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は,なんだか簡体字/繁体字の変換までできるみたいですね。

トラックバック


URL から "-MoIyadayo" を削除してトラックバックを送信してください。
トラックバックは承認後に表示されます。

見てた人いたんですね

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$さん、そりゃないでしょという感じ。ほぼ、一日費やしてしまいましたよ。