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.