Compartir por


SET ARITHABORT (Transact-SQL)

Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Punto de conexión de análisis SQL en Microsoft Fabric Almacenamiento 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

Establezca siempre ARITHABORT en ON en las sesiones de inicio de sesión. Establecer ARITHABORT en OFF puede afectar negativamente a la optimización de consultas, lo que produce problemas de rendimiento.

Advertencia

La configuración predeterminada de ARITHABORT para SQL Server Management Studio es ON. Las aplicaciones cliente que establecen ARITHABORT en OFF podrían recibir distintos planes de consulta, lo que dificulta la solución de problemas de consultas con un rendimiento bajo. Es decir, la misma consulta podría ejecutarse más deprisa en Management Studio y más despacio en la aplicación. Al solucionar problemas de consultas con Management Studio, use siempre la configuración de ARITHABORT del cliente.

Si SET ARITHABORT y SET ANSI WARNINGS son ON, estas condiciones de error pueden terminar una consulta.

Si SET ARITHABORT es ON y SET ANSI WARNINGS es OFF, estas condiciones de error pueden cancelar un lote. Si los errores se producen en una transacción, ésta se revierte. Cuando SET ARITHABORT es OFF y se produce 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 son OFF y se produce uno de estos errores, aparece un mensaje de advertencia y el resultado de la operación aritmética es NULL.

Nota:

Si set ARITHABORT ni SET ARITHIGNORE está activado, SQL Server devuelve NULL y aparece un mensaje de advertencia después de que se ejecute la consulta.

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

Para la evaluación de expresiones, si SET ARITHABORT es OFF y una instrucción INSERT, UPDATE o DELETE se encuentra en una instrucción aritmética, desbordamiento, división por cero o error 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.

Si SET ARITHABORT o SET ARITHIGNORE es OFF y SET ANSI_WARNINGS es ON, SQL Server devolverá un mensaje de error cuando haya errores de división por cero o desbordamiento.

Si SET ARITHABORT está establecido en OFF y se produce un error de anulación durante la evaluación de una condición booleana de una instrucción IF, se ejecutará la rama FALSE.

SET ARITHABORT también debe ser ON al crear o cambiar índices en columnas calculadas o vistas indizadas. Si SET ARITHABORT es OFF, las instrucciones CREATE, UPDATE, INSERT y DELETE provocarán errores en tablas con índices en columnas calculadas y vistas indizadas.

La opción SET ARITHABORT se establece en tiempo de ejecución, no en tiempo de análisis.

SET ARITHABORT OFF no se admite en grupos de SQL dedicados de Azure Synapse Analytics.

Para ver la configuración actual de SET ARITHABORT, ejecute 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