- ベストアンサー
【SQLServer】UNICODEから文字への変換について
SQLServer2005を利用しています。 半角→全角変換の関数を作成するために、一度unicode関数を使用したいと考えています。 が、UNICODEから文字への変換方法がわからず困っています。 文字からunicodeへは、UNICODE関数があるのですが、逆はないのでしょうか? 一方通行にしか変換できないのでしょうか? ご存知の方よろしくおねがいします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
>SQLSERVER2005インストールすると.NET FRAMEWORKもインストールされたような気がするのですが、勘違いでしょうか。 勘違いではないですよ。 だから「CLRの使えないSQL Server 2005は存在しない」です(有効にさえすれば)。 VS2005がないとコンパイルと配置が面倒なだけですが、できないわけではなく、やり方はもう載せておられる通りです(自習書もあります)。
その他の回答 (6)
- nora1962
- ベストアンサー率60% (431/717)
> 今回のシステムでは.NETは実行環境に入っていませんので > 無理なのです。。。 SQLSERVER2005インストールすると.NET FRAMEWORKもインストールされた ような気がするのですが、勘違いでしょうか。
お礼
そうだったんですか、知りませんでした。 有効になっているかどうか確認してみます。 ありがとうございました。
- jamshid6
- ベストアンサー率88% (591/669)
#1です。 UNICODE関数と全角変換に何の関係があるのだろうと思いましたが、そういうことですか。 一応答えを書いておきます。 SELECT NCHAR(UNICODE('あ')),CHAR(ASCII('A')) ただ、コード変換する意味は今回のケースではないでしょうね。 私も他の方のアドバイスの通り、CLRを使うことをお勧めします。 総当たりでの変換モジュールはとにかく遅いし、照合順序がJapanese_CI_ASだった日にはCOLLATEも指定しないといけなくて、さらに遅くなるしで、たぶん実用には耐えないでしょう。 私のところでも逆に半角変換の処理にはCLRを使っています。アセンブリはセーフで配置できるので、開発ポリシーに抵触しない限りはCLRの使用を認めてもらった方がいいでしょう。
お礼
そうなんです。。 サーバーの設定がJapanese_CI_ASだったため COLLATEも必要なんです。。。 COLLATE指定するとさらに遅くなるのですね。 知りませんでした。 勉強になります。ありがとうございました。
- nora1962
- ベストアンサー率60% (431/717)
MS SQLSERVERにはOracleと違ってTRANSLATE関数がないんです。 ユーザー関数作るにしてもループで回して、半角文字総当りで検索掛けると いう力技しか思いつきません。 今回のようなケース(CLR側のロジックが単純)ではCLRを利用してもいいの ではないかなと思います。データベースごとにアセンブリ配置する手間が 生じますが。
お礼
>TRANSLATE関数 確かにないです。 どうしてもORACLEに慣れてしまっているので最初に探したのですが 無かったです。 ご回答ありがとうございました。
- nora1962
- ベストアンサー率60% (431/717)
以下の内容のSqlClrStrConv.vbをc:\tmpに作成します。 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 コンパイルします。 c:\tmp>vbc vbc /out:SqlClrStrConv.dll /t:library /r:"C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\sqlaccess.dll" SqlClrStrConv.vb sqlcmdかクエリアナライザで以下のコマンドを実行します。 USE [pubs] GO create ASSEMBLY [SqlClrStrConv] FROM 'C:\tmp\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 これで select cast( dbo.SqlStrConv('abc',4) as nvarchar(10) ) go で全角に変換できます。
お礼
ご回答ありがとうございます。 CLRを利用すれば確かにできそうですね。 T-SQLのみでの実現は不可能でしょうか? 一応、いまのところベタベタに変換しています。 Set @VarConvValues = Case @VarConvValues -- ア行 When 'ア' Then 'ア' When 'イ' Then 'イ' When 'ウ' Then 'ウ' When 'エ' Then 'エ' When 'オ' Then 'オ' ・・・ ・・・ のような感じです。
- nora1962
- ベストアンサー率60% (431/717)
MS SQLSERVER のBINNディレクトリに「sqlaccess.dll」があれば、SQLCLR 機能を利用して.NETのStrConv関数を呼び出せませんか。
お礼
ありがとうございます。 今回のシステムでは.NETは実行環境に入っていませんので 無理なのです。。。
- jamshid6
- ベストアンサー率88% (591/669)
全角変換のためにUNICODE関数を使うのはなぜですか?
補足
変換するために一度コードに変換し、マップに基づいて変換しようと考えました。 文字→コードへの変換関数についてはASCIIとUNICODEがありましたが ASCIIについては全角文字のコードが用意されていないため UNICODEを使用することにしました。 文字→コードへの変換はできるのですが、 コード→文字の方法が分からなかったため質問させていただきました。
お礼
なるほど。わかりました。 自習書の存在を初めて知りました。いろいろありますね。 有用な情報をいただきありがとうございました。 活用させていただきたいと思います。 CLRについては今後も継続的に使用していくことも視野に含めて サーバー管理者やお客さんと調整してみたいと思います。