エラーMsg8115、レベル16、intをデータ型数値に変換する算術オーバーフローエラーを受け取った場合 SQL Serverでは、範囲外の値が原因でデータ変換エラーが発生する操作を実行していることが原因である可能性があります。
これは、数値を別のデータ型に変換しようとしたときによく発生しますが、新しいデータ型で受け入れられる範囲外です。
エラーの例
エラーを生成するコードの例を次に示します。
SELECT CAST(275 AS DECIMAL(3, 2));
結果:
Msg 8115, Level 16, State 8, Line 1 Arithmetic overflow error converting int to data type numeric.
この場合、私は整数を小数に変換しようとしていました。
しかし、私の間違いは、結果の10進値に対して3の精度しか許可しなかったことです。この精度は、この操作によって生成される値(275.00
)には不十分です。 。
ソリューション
問題は簡単に修正できます:
SELECT CAST(275 AS DECIMAL(5, 2));
結果:
275.00
私がしたのは、精度の引数をより十分な値に増やすことだけでした。
具体的には、3
から増やしました 5
へ 。
より大きな整数が通過することを期待していた場合(たとえば、整数がデータベース列にある場合)、より大きな値を処理できるように精度を上げる必要があります。
明確にするために、精度は格納される小数点以下の桁の最大総数です。この数値には、小数点の左側と右側の両方が含まれます。精度は1
の値である必要があります 38
の最大精度を介して 。デフォルトの精度は18
です 。
さまざまなシナリオで同じエラー
SUM()
などの関数を使用すると、同じエラー(Msg 8115)が発生する可能性があります(わずかに異なるエラーメッセージが表示されます)。 列にあり、計算の結果、列のタイプの範囲外の値になります。これを修正するには、SQLServerの「式をデータ型intに変換する算術オーバーフローエラー」を修正するを参照してください。
また、IDENTITY
のときにテーブルにデータを挿入しようとすると、同じエラー(Msg 8115)が発生する可能性があります(わずかに異なるエラーメッセージが表示されます)。 列がデータ型の制限に達しました。修正:「IDENTITY
の変換における算術オーバーフローエラー」を参照してください。 これを修正する方法については、SQLServerの「todatatype…」を参照してください。