sql >> Base de Datos >  >> RDS >> Sqlserver

5 formas de corregir el error "Dividir por cero" en SQL Server (Msg 8134)

Aquí hay cinco opciones para lidiar con el mensaje de error 8134 “Se encontró un error de división por cero” en SQL Server.

El Error

Primero, aquí hay un ejemplo de código que produce el error del que estamos hablando:

SELECT 1 / 0;

Resultado:

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

Obtenemos el error porque estamos tratando de dividir un número por cero. Matemáticamente, esto no tiene ningún sentido. No puede dividir un número por cero y esperar un resultado significativo.

Para lidiar con este error, debemos decidir qué se debe devolver cuando intentamos dividir por cero. Por ejemplo, podríamos querer que se devuelva un valor nulo. O podríamos querer que se devuelva cero. O algún otro valor.

A continuación se muestran algunas opciones para solucionar este error.

Opción 1:El NULLIF() Expresión

Una forma rápida y fácil de lidiar con este error es usar NULLIF() expresión:

SELECT 1 / NULLIF( 0, 0 );

Resultado:

NULL

NULLIF() devuelve NULL si las dos expresiones especificadas tienen el mismo valor. Devuelve la primera expresión si las dos expresiones son diferentes. Por lo tanto, si usamos cero como segunda expresión, obtendremos un valor nulo siempre que la primera expresión sea cero. Dividir un número por NULL da como resultado NULL .

En realidad, SQL Server ya devuelve NULL en un error de dividir por cero, pero en la mayoría de los casos no vemos esto, debido a nuestro ARITHABORT y ANSI_WARNINGS configuración (más sobre esto más adelante).

Opción 2:Agrega el ISNULL() Función

En algunos casos, es posible que prefiera devolver un valor que no sea NULL .

En tales casos, puede pasar el ejemplo anterior al ISNULL() función:

SELECT ISNULL(1 / NULLIF( 0, 0 ), 0);

Resultado:

0

Aquí especifiqué que se debe devolver cero siempre que el resultado sea NULL .

Sin embargo, ten cuidado. En algunos casos, devolver cero puede ser inapropiado. Por ejemplo, si se trata de suministros de inventario, especificar cero podría implicar que no hay productos, lo que podría no ser el caso.

Opción 3:Usa un CASE Declaración

Otra forma de hacerlo es usar un CASE declaración:

DECLARE @n1 INT = 20;
DECLARE @n2 INT = 0;

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

Resultado:

NULL

Opción 4:El SET ARITHABORT Declaración

El SET ARITHABORT finaliza una consulta cuando se produce un desbordamiento o un error de división por cero durante la ejecución de la consulta. Podemos usarlo junto con SET ANSI WARNINGS para devolver NULL siempre que ocurra el error de dividir por cero:

SET ARITHABORT OFF;
SET ANSI_WARNINGS OFF;
SELECT 20 / 0;

Resultado:

NULL

Microsoft recomienda que siempre establezca ARITHABORT a ON en sus sesiones de inicio de sesión, y configurarlo en OFF puede tener un impacto negativo en la optimización de consultas, lo que genera problemas de rendimiento.

Algunos clientes (como SQL Server Management Studio) establecen ARITHABORT a ON por defecto. Esta es la razón por la que probablemente no vea el NULL valor que se devuelve cuando se divide por cero. Puedes usar SET ARITHIGNORE para cambiar este comportamiento si lo prefiere.

Opción 5:El SET ARITHIGNORE Declaración

El SET ARITHIGNORE La declaración controla si los mensajes de error se devuelven por desbordamiento o errores de división por cero durante una 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.

Aquí, configuro ARITHABORT y ANSI_WARNINGS a OFF para que la declaración no se cancelara debido al error, y NULL se devuelve cada vez que hay un error de división por cero.

Tenga en cuenta que SET ARITHIGNORE la configuración solo controla si se devuelve un mensaje de error. SQL Server devuelve un NULL en un cálculo que involucre un desbordamiento o un error de división por cero, independientemente de esta configuración.

En el ejemplo anterior podemos ver que cuando ARITHIGNORE está ON , no se devuelve el error de división por cero. Cuando está OFF , se devuelve el mensaje de error de división por cero.