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.