知っている人は知っていると思いますが、自分にとっては新発見だったので紹介します。
今回、T-SQLで文字列の左から指定バイトを取り出す処理が必要になりました。
この手の処理で問題となるのは半角/全角混在の場合で、指定されたバイト位置にちょうど全角がくると、最後の文字が化けてしまいます。
他の言語では自前で関数を用意していて、ロジックはたいてい「1文字づつループして、そのバイト数を取り、指定バイト以内で返却文字列へ結合していく」といった感じになっています。
さて、それをT-SQLで実現しようと思い、「lenとsubstringで1文字づつループしてdatalengthでバイトチェックかな」などと思考していましたが、ふと「convertしたらどうなるんだろう」と思いやってみると、実はこれだけでできてしまいました。
select convert(varchar(1),'ああ') -- ⇒ ''
select convert(varchar(2),'ああ') -- ⇒ 'あ'
select convert(varchar(3),'ああ') -- ⇒ 'あ'
select convert(varchar(4),'ああ') -- ⇒ 'ああ'
T-SQLは文字列処理に向いていないと思っていたのですが、ちょっと見直しました。