> [ReqNo] char NOT NULL> INSERT INTO ##TEST VALUES ('2200000000',1,NULL);> SELECT * FROM ##TEST WHERE [ReqNo]=0;> varchar の値 '2200000000' の変換が int 型の列でオーバーフローしました。
SQL Server の仕様通りの結果でしょう。
Transact-SQL (T-SQL) Reference: Data type conversion (Database Engine)
Transact-SQL (T-SQL) Reference: Data type precedence (Transact-SQL)
・データ型が異なる値同士を比較しようとする際、暗黙的に
優先順位の低いデータ型を優先順位の高いデータ型に
変換しようとする。
・char 型の値と整数リテラル( int 型の値)を比較する場合、、
char 型の優先順位( 28 位)よりも int 型の優先順位( 16 位)の方が
高いため、char 型の値を int 型に型変換できるかどうかを試行する。
・'0000000000'のように「数字のみで構成された文字列」であれば
「基本的には」数値データへの変換が可能ではあるが、実際には
変換先となるデータ型の有効範囲による制限を受ける。
・int 型の有効範囲は -2,147,483,648 から 2,147,483,647 までである。
・したがって、'2200000000' という文字列を
2,200,000,000 という int 型の数値に変換しようとしても
int 型の有効範囲を超えているため、オーバーフローエラーが発生する。