システム連携とかやっているとこんな状況があるかと思います。
1. テーブル設計をしている際、「文字列はnvarchar型で!」
2. 項目Aは別システムと連携する項目。連携先と同じ長さに。
3. 連携先の項目Aの型はvarchar型。
4. nvarchar型とvarchar型では、長さの数え方が違うから全角が混在したデータが入った場合、桁あふれ!?
というわけでこれの対応策。
CHECK制約を利用することで、nvarchar型でありながら、varchar型の文字数しか入らないようにDB側で制限かけるが可能です。
例:nvarchar(7)にて、varchar(7)で入る分しかいれないようにする。
CheckLengthVarchar.sql
ALTER TABLE [TABLE_AA] --テーブル名
ADD CONSTRAINT [CK_TABLE_AA] --Check制約名
CHECK (
DATALENGTH( CONVERT(varchar(8), [TABLE_ID])) <= 7 --varchar型に変換し長さを比較
/* varcharはデフォルトで30桁になるので、必ず長さを記述する。
その際は、制限したい長さよりも大きくすること */
);
- 定義が少々複雑になる。
- Insert/Update時の性能が落ちる。
CHECK制約をつけることになるため、上記のデメリットもありますので、それを了承したうえで使用しましょう。