TechNet
Exportar (0) Imprimir
Expandir todo

SET ARITHABORT (Transact-SQL)

 

**ESTE TEMA SE APLICA A:** ![](../Image/Applies%20to/yes.png)SQL Server \(a partir de 2008\) ![](../Image/Applies%20to/yes.png)Base de datos SQL de Azure ![](../Image/Applies%20to/yes.png)Almacenamiento de datos SQL de Azure ![](../Image/Applies%20to/yes.png)Almacenamiento de datos paralelos

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

Se aplica a: de SQL Server (SQL Server 2008 a la versión actual), Base de datos SQL de Azure.

Topic link icon Convenciones de sintaxis de Transact-SQL

  
SET ARITHABORT { ON | OFF }  
[ ; ]  

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.

System_CAPS_ICON_warning.jpg Advertencia


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 consulta, 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.

System_CAPS_ICON_note.jpg 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, ARITHABORT se establece de forma implícita en ON cuando el nivel de compatibilidad de base de datos está establecido en 90 o un valor superior. 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.

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.

Para ver la configuración actual de este valor, ejecute la consulta siguiente.

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

Debe pertenecer al rol public.

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  

Instrucciones SET (Transact-SQL)
SET ARITHIGNORE (Transact-SQL)
SESSIONPROPERTY (Transact-SQL)

Adiciones de comunidad

Mostrar:
© 2016 Microsoft