【SQL Server】SUM()使用時のオーバーフローについて
会社でちょっと引っかかったのでメモ
○ SELECT SUM(2147483647); ○ SELECT SUM(2147483648); × SELECT SUM(2147483647 + 1);
※2147483647…SQL Server の integer 型の最大値
2147483648 = 2147483647 + 1 でありますが、上記の通り2行目のクエリは成功しているのに対し3行目のクエリは「expression をデータ型 int に変換中に、算術オーバーフロー エラーが発生しました。」とエラーになります。
まだ検証していないので憶測ですが SUM は () 内の最初の値から () 内の値の型を暗黙的に判定しているためかと思われます。
2行目は 2147483648 = bigint(かな?) と判定しているため integer の最大値より大きな値がが入っても落ちませんでした。
しかし、3行目は 2147483647 = integer と判定していますが + 1 をしているために integer 型の最大値超えでオーバーフローになったのかと思われます。
下記のように書くとオーバーフローになりません。
SELECT SUM(CAST(2147483647 AS BIGINT) + 1);