SET ARITHABORT (Transact-SQL)

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

Icono de vínculo a temas Convenciones de sintaxis de Transact-SQL

Sintaxis

SET ARITHABORT { ON | OFF }
[ ; ]

Comentarios

Debe establecer 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.

Nota de advertenciaAdvertencia

La configuración predeterminada de ARITHABORT para SQL Server Management Studio es ON. Las aplicaciones cliente que establecen ARITHABORT en OFF pueden recibir distintos planes de consultas, lo que dificulta la solución de problemas de consultas con un rendimiento bajo. Es decir, la misma consulta puede 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 es ON y SET ANSI WARNINGS es ON, estas condiciones de error pueden cancelar 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. Si SET ARITHABORT es OFF y se produce uno de estos errores, aparece un mensaje de advertencia y se asigna el valor NULL al resultado de la operación aritmética.

Si SET ARITHABORT es OFF y SET ANSI WARNINGS es OFF y se produce uno de estos errores, aparece un mensaje de advertencia y se asigna el valor NULL al resultado de la operación aritmética.

[!NOTA]

Si no se ha establecido SET ARITHABORT ni SET ARITHIGNORE, SQL Server devuelve NULL y muestra un mensaje de advertencia después de ejecutar la consulta.

Al establecer ANSI_WARNINGS en ON, implícitamente establece ARITHABORT en ON cuando el nivel de compatibilidad de la base de datos se establece en 90. Si el nivel de compatibilidad de base de datos está establecido en 80 o menos, debe establecer explícitamente la opción ARITHABORT en ON.

Si al evaluar una expresión con SET ARITHABORT en OFF, una instrucción INSERT, DELETE o UPDATE encuentra un error aritmético, desbordamiento, división por cero o error de dominio, SQL Server inserta o actualiza un valor NULL. 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 es 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.

Permisos

Necesita la pertenencia al rol public.

Ejemplos

En este ejemplo se muestran errores de división por cero y desbordamiento con las dos 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

Vea también

Referencia

Instrucciones SET (Transact-SQL)

SET ARITHIGNORE (Transact-SQL)

SESSIONPROPERTY (Transact-SQL)