エラーMsg8115、レベル16、式をデータ型intに変換する算術オーバーフローエラーを受け取った場合 SQL Serverでは、範囲外の値になる計算を実行している可能性があります。
これは、 SUM()
などの関数を使用するときに
エラーの例
エラーを生成するコードの例を次に示します。
SELECT SUM(bank_balance)
FROM accounts;
結果:
Msg 8115, Level 16, State 2, Line 1 Arithmetic overflow error converting expression to data type int.
この場合、 SUM()
を使用しました bank_balance
の合計を取得する関数 int
のデータ型を持つ列 。
計算結果がint
の範囲外であるため、エラーが発生しました データ型。
これが私のテーブルのすべてのデータです:
SELECT bank_balance
FROM accounts;
結果:
+----------------+ | bank_balance | |----------------| | 1300000000 | | 1200000000 | | 800500000 | +----------------+
これらはいくつかの大きな銀行の残高です…そしてそれらの3つを追加すると、 int
よりも多くの数になります 処理できます( int
範囲は-2,147,483,648〜2,147,483,647です。
ソリューション
int
を変換することで、このエラーに対処できます。 列からbigint
クエリを実行するとき:
SELECT SUM(CAST(bank_balance AS bigint))
FROM Accounts;
結果:
3300500000
今回はうまくいきました。
より永続的なソリューションのために、実際の列のデータ型を変更することもできます。
ご参考までに、<code> bigint 範囲は-9,223,372,036,854,775,808から9,223,372,036,854,775,807です。
さまざまなシナリオで同じエラー
データ型間で明示的に変換しようとしたときに、元の値が新しい型の範囲外である場合にも、同じエラー(Msg 8115)が発生する可能性があります(わずかに異なるエラーメッセージが表示されます)。 これを修正するには、SQLServerの「intをデータ型numericに変換する算術オーバーフローエラー」の修正を参照してください。
IDENTITY
のときにテーブルにデータを挿入しようとすると、同じエラー(Msg 8115)が発生する可能性があります(わずかに異なるエラーメッセージが表示されます)。 列がデータ型の制限に達しました。修正:「 IDENTITY
の変換における算術オーバーフローエラー」を参照してください。 これを修正する方法については、SQLServerの「todatatype…」を参照してください。