エラーメッセージ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
の場合 、ゼロ除算エラーメッセージが返されます。