/* あとでなおす */

友達募集中

【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);