sql >> データベース >  >> RDS >> Sqlserver

SQLServerの「式をデータ型intに変換する算術オーバーフローエラー」を修正しました

    エラー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…」を参照してください。


    1. 多くの列を持つクエリで単一の列を集約します

    2. N+1の冗長性とサーバーの統合

    3. TIME()の例– MySQL

    4. 2017年に最も人気のあるデータベースブログの投稿