SET SET ARITHABORT (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseInstancia administrada de Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Punto de conexión de SQL Analytics en Microsoft FabricAlmacén en Microsoft FabricBase de datos SQL en Microsoft Fabric

Termina una consulta cuando se produce un error de desbordamiento o división por cero durante su ejecución.

Convenciones de sintaxis de Transact-SQL

Sintaxis

Sintaxis de SQL Server y un grupo de SQL sin servidor en Azure Synapse Analytics, Microsoft Fabric

SET ARITHABORT { ON | OFF }

Sintaxis para Azure Synapse Analytics y Sistema de la plataforma de análisis (PDW)

SET ARITHABORT ON

Comentarios

Siempre pon ARITHABORT en ON en tus sesiones de inicio de sesión. Poner ARITHABORT en OFF puede afectar negativamente a la optimización de consultas, lo que puede provocar problemas de rendimiento.

Advertencia

La configuración predeterminada ARITHABORT de SQL Server Management Studio está ACTIVADA. Las aplicaciones cliente que se configuran ARITHABORT en OFF pueden recibir diferentes planes de consulta, lo que dificulta la resolución de consultas con mal desempeño. Es decir, la misma consulta podría ejecutarse más deprisa en Management Studio y más despacio en la aplicación. Cuando resuelvas consultas con Management Studio, siempre coincide con la configuración del cliente ARITHABORT .

Cuando SET ARITHABORT las ADVERTENCIAS ANSI SET están activadas, estas condiciones de error hacen que la consulta termine.

Cuando SET ARITHABORT está ENCENDIDO y SET las ADVERTENCIAS ANSI están DESACTIVADAS, estas condiciones de error hacen que el lote termine. Si los errores se producen en una transacción, ésta se revierte. Cuando SETSET ARITHABORT está OFF y ocurre uno de estos errores, aparece un mensaje de advertencia y el resultado de la operación aritmética es NULL.

Si SET ARITHABORT y SET ANSI WARNINGS están DESACTIVADOS y ocurre uno de estos errores, aparece un mensaje de advertencia y el resultado de la operación aritmética es NULL.

Nota:

Si ninguno SET ARITHABORT de SETSET ARITHIGNORE los dos está ACTIVADO, SQL Server devuelve NULL y aparece un mensaje de advertencia tras ejecutarse la consulta.

Cuando ANSI_WARNINGS tiene un valor ON y el nivel de compatibilidad de la base de datos está establecido en 90 o superior, entonces ARITHABORT implícitamente está ON independientemente de su configuración de valor. Si el nivel de compatibilidad de la base de datos está configurado en 80 o antes, la ARITHABORT opción debe estar explícitamente en ACTIVADO.

Para la evaluación de expresións, si SET ARITHABORT está DESPAGADO y aparece una INSERTinstrucción , UPDATE, o DELETE una sentencia que aparece con un error aritmético, de desbordamiento, división por cero o de dominio, SQL Server inserta o actualiza un NULL valor. Si la columna de destino no acepta valores NULL, no se puede efectuar la acción de inserción o actualización y el usuario recibe un error.

Cuando cualquiera SET ARITHABORT de los dos SETSET ARITHIGNORE está OFF y SETSET ANSI_WARNINGS ON, SQL Server sigue devolviendo un mensaje de error al encontrar errores de división por cero o de desbordamiento.

Cuando SETSET ARITHABORT está OFF y se produce un error de aborto durante la evaluación de la condición booleana de una sentencia IF, se ejecuta la rama FALSE.

SET SET ARITHABORT debe estar ACTIVADO cuando creas o cambias índices en columnas calculadas o vistas indexadas. Si SET ARITHABORT está OFF, CREATE, UPDATE, INSERT, y DELETE las sentencias en tablas con índices en columnas calculadas o vistas indexadas fallan.

La configuración de SETSET ARITHABORT ocurre en tiempo de ejecución o ejecución y no en tiempo de análisis analquénico.

SET SET ARITHABORTOFF no está compatible con los pools SQL dedicados de Azure Synapse Analytics.

Para ver la configuración actual de SETSET ARITHABORT, ejecuta la siguiente consulta:

DECLARE @ARITHABORT VARCHAR(3) = 'OFF';  
IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = 'ON';  
SELECT @ARITHABORT AS ARITHABORT;  

Permisos

Debe pertenecer al rol public .

Ejemplos

En este ejemplo se muestran errores de división por cero y desbordamiento con las opciones de SET ARITHABORT.

-- SET ARITHABORT  
-------------------------------------------------------------------------------  
-- Create tables t1 and t2 and insert data values.  
CREATE TABLE t1 (  
   a TINYINT,   
   b TINYINT  
);  
CREATE TABLE t2 (  
   a TINYINT  
);  
GO  
INSERT INTO t1   
VALUES (1, 0);  
INSERT INTO t1   
VALUES (255, 1);  
GO  
  
PRINT '*** SET ARITHABORT ON';  
GO  
-- SET ARITHABORT ON and testing.  
SET ARITHABORT ON;  
GO  
  
PRINT '*** Testing divide by zero during SELECT';  
GO  
SELECT a / b AS ab   
FROM t1;  
GO  
  
PRINT '*** Testing divide by zero during INSERT';  
GO  
INSERT INTO t2  
SELECT a / b AS ab    
FROM t1;  
GO  
  
PRINT '*** Testing tinyint overflow';  
GO  
INSERT INTO t2  
SELECT a + b AS ab   
FROM t1;  
GO  
  
PRINT '*** Resulting data - should be no data';  
GO  
SELECT *   
FROM t2;  
GO  
  
-- Truncate table t2.  
TRUNCATE TABLE t2;  
GO  
  
-- SET ARITHABORT OFF and testing.  
PRINT '*** SET ARITHABORT OFF';  
GO  
SET ARITHABORT OFF;  
GO  
  
-- This works properly.  
PRINT '*** Testing divide by zero during SELECT';  
GO  
SELECT a / b AS ab    
FROM t1;  
GO  
  
-- This works as if SET ARITHABORT was ON.  
PRINT '*** Testing divide by zero during INSERT';  
GO  
INSERT INTO t2  
SELECT a / b AS ab    
FROM t1;  
GO  
PRINT '*** Testing tinyint overflow';  
GO  
INSERT INTO t2  
SELECT a + b AS ab   
FROM t1;  
GO  
  
PRINT '*** Resulting data - should be 0 rows';  
GO  
SELECT *   
FROM t2;  
GO  
  
-- Drop tables t1 and t2.  
DROP TABLE t1;  
DROP TABLE t2;  
GO