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

SQL Serverの「ゼロ除算エラー」を修正する5つの方法(メッセージ8134)

    エラーメッセージ8134「ゼロ除算エラーが発生しました」に対処するための5つのオプションを次に示します。 SQLServerで。

    エラー

    まず、これが私たちが話しているエラーを生成するコードの例です:

    SELECT 1 / 0;

    結果:

    Msg 8134, Level 16, State 1, Line 1
    Divide by zero error encountered.

    数値をゼロで除算しようとしているため、エラーが発生します。数学的には、これは意味がありません。数値をゼロで割って意味のある結果を期待することはできません。

    このエラーに対処するには、ゼロ除算を試みたときに何を返すかを決定する必要があります。たとえば、null値を返したい場合があります。または、ゼロを返したい場合があります。または他の値。

    以下は、このエラーに対処するためのいくつかのオプションです。

    オプション1:NULLIF()

    このエラーにすばやく簡単に対処するには、NULLIF()を使用します。 式:

    SELECT 1 / NULLIF( 0, 0 );

    結果:

    NULL

    NULLIF() NULLを返します 指定された2つの式が同じ値の場合。 2つの式が異なる場合は、最初の式を返します。したがって、2番目の式としてゼロを使用すると、最初の式がゼロになるたびにnull値が取得されます。数値をNULLで割る 結果はNULL

    実際、SQLServerはすでにNULLを返します ゼロ除算エラーの場合ですが、ARITHABORTが原因で、ほとんどの場合、これは表示されません。 およびANSI_WARNINGS 設定(これについては後で詳しく説明します)。

    オプション2:ISNULL()を追加します 機能

    場合によっては、NULL以外の値を返すことをお勧めします。 。

    このような場合は、前の例をISNULL()に渡すことができます。 機能:

    SELECT ISNULL(1 / NULLIF( 0, 0 ), 0);

    結果:

    0

    ここでは、結果がNULLの場合は常にゼロが返されるように指定しました。 。

    ただし、注意してください。場合によっては、ゼロを返すことが不適切な場合があります。たとえば、在庫供給を扱っている場合、ゼロを指定すると、製品がゼロであることを意味する場合がありますが、そうではない場合があります。

    オプション3:CASEを使用する ステートメント

    これを行う別の方法は、CASEを使用することです。 ステートメント:

    DECLARE @n1 INT = 20;
    DECLARE @n2 INT = 0;
    
    SELECT CASE
        WHEN @n2 = 0
        THEN NULL
        ELSE @n1 / @n2
    END

    結果:

    NULL

    オプション4:SET ARITHABORT ステートメント

    SET ARITHABORT ステートメントは、クエリの実行中にオーバーフローまたはゼロ除算エラーが発生したときにクエリを終了します。 SET ANSI WARNINGSと組み合わせて使用​​できます NULLを返す ゼロ除算エラーが発生する可能性がある場合:

    SET ARITHABORT OFF;
    SET ANSI_WARNINGS OFF;
    SELECT 20 / 0;

    結果:

    NULL

    常にARITHABORTを設定することをお勧めします ONへ ログオンセッションで、OFFに設定します クエリの最適化に悪影響を及ぼし、パフォーマンスの問題につながる可能性があります。

    一部のクライアント(SQL Server Management Studioなど) set ARITHABORT ONへ デフォルトでは。これが、おそらくNULLが表示されない理由です。 ゼロで割ったときに返される値。 SET ARITHIGNOREを使用できます 必要に応じてこの動作を変更します。

    オプション5:SET ARITHIGNORE ステートメント

    SET ARITHIGNORE ステートメントは、クエリ中にエラーメッセージがオーバーフローエラーまたはゼロ除算エラーのどちらから返されるかを制御します。

    SET ARITHABORT OFF;
    SET ANSI_WARNINGS OFF;
    
    SET ARITHIGNORE ON;
    SELECT 1 / 0 AS Result_1;
    
    SET ARITHIGNORE OFF;
    SELECT 1 / 0 AS Result_2;

    結果:

    Commands completed successfully.
    Commands completed successfully.
    Commands completed successfully.
    +------------+
    | Result_1   |
    |------------|
    | NULL       |
    +------------+
    (1 row affected)
    Commands completed successfully.
    +------------+
    | Result_2   |
    |------------|
    | NULL       |
    +------------+
    Division by zero occurred.

    ここでは、ARITHABORTを設定します およびANSI_WARNINGS OFFへ エラーが原因でステートメントが中止されないようにし、NULL ゼロ除算エラーがある場合は常に返されます。

    SET ARITHIGNOREに注意してください 設定は、エラーメッセージを返すかどうかのみを制御します。 SQLServerはNULLを返します この設定に関係なく、オーバーフローまたはゼロ除算エラーを伴う計算で。

    上記の例では、ARITHIGNORE ONです 、ゼロ除算エラーは返されません。 OFFの場合 、ゼロ除算エラーメッセージが返されます。


    1. .frmファイルからmysqlデータベースを復元します

    2. Oracleでマイナス/プラス記号を使用して数値をフォーマットする方法

    3. データベース設計者にはどのようなスキルと知識が必要ですか?

    4. あなたのデータベースがもはやあなたのために働いていないことの兆候