[SQL Server] 全角の文字列を半角に変換する方法 - fnReplaceZenkakuToHankaku

inno
2014-06-29 14:22 18445 1
MS-SQL / SQL Server / fnReplaceZenkakuToHankaku
全角の文字列を半角に変換する方法

全角の文字列を半角に変更する方法を説明します。
もし、文字列に全角が含まれているか確認だけしたい場合は
下記のリックをクリックして全角チェック関数のTIPをご参考ください。


では、全角の文字列を半角に変換する方法について説明をします。
まずは関数(Function)の作成が必要です。
下記のSQLを実行して「dbo.fnReplaceZenkakuToHankaku」関数(Function)を作成してください。

CREATE FUNCTION [dbo].[fnReplaceZenkakuToHankaku]
(
@StrVal nvarchar(100)
)
RETURNS nvarchar(100)
BEGIN

DECLARE @Result nvarchar(100)
DECLARE @TempStr nchar(1)
DECLARE @i int
DECLARE @UniCode int
SET @Result = ''
SET @i = 1
WHILE (@i <= LEN(@StrVal))
BEGIN
SET @UniCode = UNICODE(SUBSTRING(@StrVal,@i,1))
IF (@UniCode = 12288) --空欄の場合。
SET @TempStr = N''
ELSE IF ((@UniCode >= 65280) AND (@UniCode <= 65519)) --全角の場合。
SET @TempStr = NCHAR(@UniCode-65248) 
ELSE 
SET @TempStr = SUBSTRING(@StrVal,@i,1)
SET @Result = @Result + @TempStr
SET @i = @i + 1
END
RETURN @Result
END

文字列全体を確認するのではなく、文字列を一文字一文字チェックをしながら
一文字ずつ変換していく方法です。

関数(Function)の作成が終わったらテストデータを作成して確認してみましょう。

-- #### テーブル作成
CREATE TABLE #TempData
(
Idx int
,StrVal nvarchar(20)
)
GO

-- #### データ登録
INSERT INTO #TempData (Idx, StrVal)
SELECT 1, N'abcdefg' UNION ALL
SELECT 2, N'bcdefgh' UNION ALL
SELECT 3, N'jk39 chj3' UNION ALL
SELECT 4, N'kdi89320' UNION ALL
SELECT 5, N'df_elf023' UNION ALL
SELECT 6, N'sV2849_cvD823'

テストデータとしては半角のみのデータ、半角と全角が含まれているデータ、全角のみのデータを準備しました。
それでは作成した「dbo.fnReplaceZenkakuToHankaku」関数(Function)を利用して
全角の文字列が半角の文字列に変換されるのか確認してみましょう。

SELECT Idx, StrVal, dbo.fnReplaceZenkakuToHankaku(StrVal) Hankaku
FROM #TempData

実行結果

コメント

初心者 2016年 02月 16日 (17:35)
(@UniCode <= 65519) は 65374にしておかないと、半角カナなどがあったときに文字化けしてしまいますよ...

http://www.tamasoft.co.jp/ja/general-info/unicode-decimal.html