こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

SQLServer2005を利用しています。
半角→全角変換の関数を作成するために、一度unicode関数を使用したいと考えています。

が、UNICODEから文字への変換方法がわからず困っています。
文字からunicodeへは、UNICODE関数があるのですが、逆はないのでしょうか?
一方通行にしか変換できないのでしょうか?

ご存知の方よろしくおねがいします。

投稿日時 - 2009-09-11 15:10:30

QNo.5281041

すぐに回答ほしいです

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

>SQLSERVER2005インストールすると.NET FRAMEWORKもインストールされたような気がするのですが、勘違いでしょうか。
勘違いではないですよ。
だから「CLRの使えないSQL Server 2005は存在しない」です(有効にさえすれば)。

VS2005がないとコンパイルと配置が面倒なだけですが、できないわけではなく、やり方はもう載せておられる通りです(自習書もあります)。

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

投稿日時 - 2009-09-17 19:47:57

お礼

なるほど。わかりました。
自習書の存在を初めて知りました。いろいろありますね。
有用な情報をいただきありがとうございました。
活用させていただきたいと思います。

CLRについては今後も継続的に使用していくことも視野に含めて
サーバー管理者やお客さんと調整してみたいと思います。

投稿日時 - 2009-10-13 12:56:06

このQ&Aは役に立ちましたか?

10人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.6

> 今回のシステムでは.NETは実行環境に入っていませんので
> 無理なのです。。。

SQLSERVER2005インストールすると.NET FRAMEWORKもインストールされた
ような気がするのですが、勘違いでしょうか。

投稿日時 - 2009-09-17 18:23:17

お礼

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

ありがとうございました。

投稿日時 - 2009-10-13 12:53:51

ANo.5

#1です。

UNICODE関数と全角変換に何の関係があるのだろうと思いましたが、そういうことですか。
一応答えを書いておきます。
SELECT NCHAR(UNICODE('あ')),CHAR(ASCII('A'))

ただ、コード変換する意味は今回のケースではないでしょうね。

私も他の方のアドバイスの通り、CLRを使うことをお勧めします。
総当たりでの変換モジュールはとにかく遅いし、照合順序がJapanese_CI_ASだった日にはCOLLATEも指定しないといけなくて、さらに遅くなるしで、たぶん実用には耐えないでしょう。
私のところでも逆に半角変換の処理にはCLRを使っています。アセンブリはセーフで配置できるので、開発ポリシーに抵触しない限りはCLRの使用を認めてもらった方がいいでしょう。

投稿日時 - 2009-09-16 23:16:51

お礼

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

勉強になります。ありがとうございました。

投稿日時 - 2009-10-13 12:53:01

ANo.4

MS SQLSERVERにはOracleと違ってTRANSLATE関数がないんです。
ユーザー関数作るにしてもループで回して、半角文字総当りで検索掛けると
いう力技しか思いつきません。

今回のようなケース(CLR側のロジックが単純)ではCLRを利用してもいいの
ではないかなと思います。データベースごとにアセンブリ配置する手間が
生じますが。

投稿日時 - 2009-09-16 14:13:40

お礼

>TRANSLATE関数

確かにないです。
どうしてもORACLEに慣れてしまっているので最初に探したのですが
無かったです。

ご回答ありがとうございました。

投稿日時 - 2009-10-13 12:48:06

ANo.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

で全角に変換できます。

投稿日時 - 2009-09-15 22:06:27

お礼

ご回答ありがとうございます。

CLRを利用すれば確かにできそうですね。
T-SQLのみでの実現は不可能でしょうか?

一応、いまのところベタベタに変換しています。
Set @VarConvValues = Case @VarConvValues
-- ア行
When 'ア' Then 'ア'
When 'イ' Then 'イ'
When 'ウ' Then 'ウ'
When 'エ' Then 'エ'
When 'オ' Then 'オ'
・・・
・・・

のような感じです。

投稿日時 - 2009-09-16 11:02:59

ANo.2

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

投稿日時 - 2009-09-15 07:52:45

お礼

ありがとうございます。

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

投稿日時 - 2009-09-16 11:02:31

ANo.1

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

投稿日時 - 2009-09-11 16:13:54

補足

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

文字→コードへの変換はできるのですが、
コード→文字の方法が分からなかったため質問させていただきました。

投稿日時 - 2009-09-16 10:55:48

あなたにオススメの質問