• ベストアンサー

【SQLServer】UNICODEから文字への変換について

SQLServer2005を利用しています。 半角→全角変換の関数を作成するために、一度unicode関数を使用したいと考えています。 が、UNICODEから文字への変換方法がわからず困っています。 文字からunicodeへは、UNICODE関数があるのですが、逆はないのでしょうか? 一方通行にしか変換できないのでしょうか? ご存知の方よろしくおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.7

>SQLSERVER2005インストールすると.NET FRAMEWORKもインストールされたような気がするのですが、勘違いでしょうか。 勘違いではないですよ。 だから「CLRの使えないSQL Server 2005は存在しない」です(有効にさえすれば)。 VS2005がないとコンパイルと配置が面倒なだけですが、できないわけではなく、やり方はもう載せておられる通りです(自習書もあります)。

参考URL:
http://msdn.microsoft.com/ja-jp/sqlserver/cc720684.aspx
mamiyak
質問者

お礼

なるほど。わかりました。 自習書の存在を初めて知りました。いろいろありますね。 有用な情報をいただきありがとうございました。 活用させていただきたいと思います。 CLRについては今後も継続的に使用していくことも視野に含めて サーバー管理者やお客さんと調整してみたいと思います。

その他の回答 (6)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.6

> 今回のシステムでは.NETは実行環境に入っていませんので > 無理なのです。。。 SQLSERVER2005インストールすると.NET FRAMEWORKもインストールされた ような気がするのですが、勘違いでしょうか。

mamiyak
質問者

お礼

そうだったんですか、知りませんでした。 有効になっているかどうか確認してみます。 ありがとうございました。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.5

#1です。 UNICODE関数と全角変換に何の関係があるのだろうと思いましたが、そういうことですか。 一応答えを書いておきます。 SELECT NCHAR(UNICODE('あ')),CHAR(ASCII('A')) ただ、コード変換する意味は今回のケースではないでしょうね。 私も他の方のアドバイスの通り、CLRを使うことをお勧めします。 総当たりでの変換モジュールはとにかく遅いし、照合順序がJapanese_CI_ASだった日にはCOLLATEも指定しないといけなくて、さらに遅くなるしで、たぶん実用には耐えないでしょう。 私のところでも逆に半角変換の処理にはCLRを使っています。アセンブリはセーフで配置できるので、開発ポリシーに抵触しない限りはCLRの使用を認めてもらった方がいいでしょう。

mamiyak
質問者

お礼

そうなんです。。 サーバーの設定がJapanese_CI_ASだったため COLLATEも必要なんです。。。 COLLATE指定するとさらに遅くなるのですね。 知りませんでした。 勉強になります。ありがとうございました。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.4

MS SQLSERVERにはOracleと違ってTRANSLATE関数がないんです。 ユーザー関数作るにしてもループで回して、半角文字総当りで検索掛けると いう力技しか思いつきません。 今回のようなケース(CLR側のロジックが単純)ではCLRを利用してもいいの ではないかなと思います。データベースごとにアセンブリ配置する手間が 生じますが。

mamiyak
質問者

お礼

>TRANSLATE関数 確かにないです。 どうしてもORACLEに慣れてしまっているので最初に探したのですが 無かったです。 ご回答ありがとうございました。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.3

以下の内容の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 で全角に変換できます。

mamiyak
質問者

お礼

ご回答ありがとうございます。 CLRを利用すれば確かにできそうですね。 T-SQLのみでの実現は不可能でしょうか? 一応、いまのところベタベタに変換しています。 Set @VarConvValues = Case @VarConvValues -- ア行 When 'ア' Then 'ア' When 'イ' Then 'イ' When 'ウ' Then 'ウ' When 'エ' Then 'エ' When 'オ' Then 'オ' ・・・ ・・・ のような感じです。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

MS SQLSERVER のBINNディレクトリに「sqlaccess.dll」があれば、SQLCLR 機能を利用して.NETのStrConv関数を呼び出せませんか。

mamiyak
質問者

お礼

ありがとうございます。 今回のシステムでは.NETは実行環境に入っていませんので 無理なのです。。。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

全角変換のためにUNICODE関数を使うのはなぜですか?

mamiyak
質問者

補足

変換するために一度コードに変換し、マップに基づいて変換しようと考えました。 文字→コードへの変換関数についてはASCIIとUNICODEがありましたが ASCIIについては全角文字のコードが用意されていないため UNICODEを使用することにしました。 文字→コードへの変換はできるのですが、 コード→文字の方法が分からなかったため質問させていただきました。

関連するQ&A