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