Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

5 maneiras de corrigir o “erro de divisão por zero” no SQL Server (Msg 8134)


Aqui estão cinco opções para lidar com o erro Msg 8134 “Divide by zero error found” no SQL Server.

O erro


Primeiro, aqui está um exemplo de código que produz o erro sobre o qual estamos falando:
SELECT 1 / 0;

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

Obtemos o erro porque estamos tentando dividir um número por zero. Matematicamente, isso não faz o menor sentido. Você não pode dividir um número por zero e esperar um resultado significativo.

Para lidar com esse erro, precisamos decidir o que deve ser retornado quando tentamos dividir por zero. Por exemplo, podemos querer que um valor nulo seja retornado. Ou podemos querer que zero seja retornado. Ou algum outro valor.

Abaixo estão algumas opções para lidar com esse erro.

Opção 1:O NULLIF() Expressão


Uma maneira rápida e fácil de lidar com esse erro é usar o NULLIF() expressão:
SELECT 1 / NULLIF( 0, 0 );

Resultado:
NULL

NULLIF() retorna NULL se as duas expressões especificadas tiverem o mesmo valor. Ele retorna a primeira expressão se as duas expressões forem diferentes. Portanto, se usarmos zero como a segunda expressão, obteremos um valor nulo sempre que a primeira expressão for zero. Dividindo um número por NULL resulta em NULL .

Na verdade, o SQL Server já retorna NULL em um erro de divisão por zero, mas na maioria dos casos não vemos isso, devido ao nosso ARITHABORT e ANSI_WARNINGS configurações (mais sobre isso mais tarde).

Opção 2:adicione o ISNULL() Função


Em alguns casos, você pode preferir retornar um valor diferente de NULL .

Nesses casos, você pode passar o exemplo anterior para o ISNULL() função:
SELECT ISNULL(1 / NULLIF( 0, 0 ), 0);

Resultado:
0

Aqui eu especifiquei que zero deve ser retornado sempre que o resultado for NULL .

Tenha cuidado embora. Em alguns casos, retornar zero pode ser inadequado. Por exemplo, se você estiver lidando com suprimentos de estoque, especificar zero pode implicar que há zero produtos, o que pode não ser o caso.

Opção 3:use um CASE Declaração


Outra maneira de fazer isso é usar um CASE demonstração:
DECLARE @n1 INT = 20;
DECLARE @n2 INT = 0;

SELECT CASE
    WHEN @n2 = 0
    THEN NULL
    ELSE @n1 / @n2
END

Resultado:
NULL

Opção 4:O SET ARITHABORT Declaração


O SET ARITHABORT termina uma consulta quando ocorre um estouro ou erro de divisão por zero durante a execução da consulta. Podemos usá-lo em conjunto com SET ANSI WARNINGS para retornar NULL sempre que ocorrer o erro de divisão por zero:
SET ARITHABORT OFF;
SET ANSI_WARNINGS OFF;
SELECT 20 / 0;

Resultado:
NULL

A Microsoft recomenda que você sempre defina ARITHABORT para ON em suas sessões de logon, e que defini-lo como OFF pode afetar negativamente a otimização de consultas, levando a problemas de desempenho.

Alguns clientes (como SQL Server Management Studio) set ARITHABORT para ON por padrão. É por isso que você provavelmente não vê o NULL valor retornado quando você divide por zero. Você pode usar SET ARITHIGNORE para alterar esse comportamento, se preferir.

Opção 5:O SET ARITHIGNORE Declaração


O SET ARITHIGNORE A instrução controla se as mensagens de erro são retornadas de erros de estouro ou de divisão por zero durante uma consulta:
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;

Resultado:
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.

Aqui, defino ARITHABORT e ANSI_WARNINGS para OFF para que a instrução não seja abortada devido ao erro e NULL é retornado sempre que há um erro de divisão por zero.

Observe que o SET ARITHIGNORE configuração apenas controla se uma mensagem de erro é retornada. SQL Server retorna um NULL em um cálculo envolvendo um estouro ou erro de divisão por zero, independentemente dessa configuração.

No exemplo acima podemos ver que quando ARITHIGNORE está ON , o erro de divisão por zero não é retornado. Quando está OFF , a mensagem de erro de divisão por zero é retornada.