SQL Server で、Shift_JISで表現できない文字が含まれているかを判定する

http://blog.dksg.jp/2008/05/phpshift-jis.html

Shift_JISで表現できない文字が含まれているかを判定する方法

unicodeの文字列を一度Shift_JISに変換して文字が化けたら、Shift_JISで表現できない文字が含まれると判定できる。
判定の疑似コードとしては以下のような感じ。

function ishiftJisOnly(unicodeString) {
	shiftJisString = unicodeからshiftjisに変換(unicodeString);
	convertedUnicodeString = shiftjisからunicodeに変換(shiftJisString);
	
	if (unicodeString != convertedUnicodeString) {
		return "Shift_JISで表現できない文字が含まれている";
	} else {
		return "含まれていない";
	}
}

SQL Server での判定方法

unicodeが格納できない型(varchar)の列を用意してやり、そこにunicode入りの文字(nvarcharの列に格納されているハズ)を無理矢理そこに格納するupdateを走らせると、Shift_JISで表現できない文字が化ける。
あとは「unicode入りの列」と「文字化けた可能性がある列」を比較して異なっていれば、Shift_JISで表現できない文字が含まれていると判定できる。

サンプルコード

-- テスト用テーブル
create table #TEST_CHAR (
  c_unicode  nvarchar(99) -- unicodeが格納できる型
, c_sjis     varchar(99)  -- unicodeが格納できない型
)

insert into #TEST_CHAR values (N'あいう[unicodeの文字]', N'') -- sjisで表現できないデータ
insert into #TEST_CHAR values (N'あいう'  , N'') -- sjisで表現できるデータ

-- unicodeの値を、unicodeが保存できないvarcharに格納することで化けさせる
update #TEST_CHAR set c_sjis = c_unicode;

-- 文字が化けて元の値と異なるようになったレコードを抽出すると、
-- sjisで表現できないデータを含んだレコードが抽出できる
select * from #TEST_CHAR where c_sjis <> c_unicode;