この記事は昔書いた記事をブログから移行したものです。
表題のエラーで悩んだので悩んだ過程をメモしておきます。
この問題の原因は、
- SQL Server(だけに限らず他のRDBMSでも)では、暗黙の型変換が行われる
- 演算を行う場合、最大精度の型に合わせて演算が行われる
という特徴です。つまり、このエラーが発生する最も簡単なSQLは以下のようになります。
SELECT 46340 * 46340; -- OK!
SELECT 46341 * 46341; -- Error
これは、46341がintと解釈され、intとintの演算結果がintの範囲(-2,147,483,648~2,147,483,647)に収まりきらないためエラーになります。SQL Serverには明示的な型変換のためのCAST関数が用意されていて、
SELECT CAST(46341 AS BIGINT) * 46341; -- OK!
とすることで、bigintとintの演算となり、結果は最大精度のbigintになるためエラーになりません。また、
SELECT CAST(46341 * 46341 AS BIGINT); -- Error
のような書き方もエラーです。これも最初の特徴にあてはめて考えると、intとintの演算を先にしてしまうのでエラーになるのは自明ですね。。