SET ARITHABORT (Transact-SQL)SET ARITHABORT (Transact-SQL)

ESTE TEMA SE APLICA A: síSQL Server (a partir de 2008)síAzure SQL DatabasesíAzure SQL Data Warehouse síAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Cancela una consulta cuando se produce un error de desbordamiento o división por cero durante su ejecución.Terminates a query when an overflow or divide-by-zero error occurs during query execution.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

-- Syntax for SQL Server and Azure SQL Database

SET ARITHABORT { ON | OFF }
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse

SET ARITHABORT ON

ComentariosRemarks

Debe establecer siempre ARITHABORT en ON en las sesiones de inicio de sesión.You should always set ARITHABORT to ON in your logon sessions. Establecer ARITHABORT en OFF puede afectar negativamente optimización de consultas de impacto dan lugar a problemas de rendimiento.Setting ARITHABORT to OFF can negatively impact query optimization leading to performance issues.

Advertencia

La configuración predeterminada de ARITHABORT para SQL Server Management StudioSQL Server Management Studio es ON.The default ARITHABORT setting for SQL Server Management StudioSQL Server Management Studio is 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.Client applications setting ARITHABORT to OFF can receive different query plans making it difficult to troubleshoot poorly performing queries. Es decir, la misma consulta puede ejecutarse más deprisa en Management Studio y más despacio en la aplicación.That is, the same query can execute fast in management studio but slow in the application. Al solucionar problemas de consultas con Management StudioManagement Studio, use siempre la configuración de ARITHABORT del cliente.When troubleshooting queries with Management StudioManagement Studio always match the client ARITHABORT setting.

Si SET ARITHABORT es ON y SET ANSI WARNINGS es ON, estas condiciones de error pueden cancelar una consulta.If SET ARITHABORT is ON and SET ANSI WARNINGS is ON, these error conditions cause the query to terminate.

Si SET ARITHABORT es ON y SET ANSI WARNINGS es OFF, estas condiciones de error pueden cancelar un lote.If SET ARITHABORT is ON and SET ANSI WARNINGS is OFF, these error conditions cause the batch to terminate. Si los errores se producen en una transacción, ésta se revierte.If the errors occur in a transaction, the transaction is rolled back. 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.If SET ARITHABORT is OFF and one of these errors occurs, a warning message is displayed, and NULL is assigned to the result of the arithmetic operation.

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.If SET ARITHABORT is OFF and SET ANSI WARNINGS is OFF and one of these errors occurs, a warning message is displayed, and NULL is assigned to the result of the arithmetic operation.

Nota

Si no se ha establecido SET ARITHABORT ni SET ARITHIGNORE, SQL ServerSQL Server devuelve NULL y muestra un mensaje de advertencia después de ejecutar la consulta.If neither SET ARITHABORT nor SET ARITHIGNORE is set, SQL ServerSQL Server returns NULL and returns a warning message after the query is executed.

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.Setting ANSI_WARNINGS to ON implicitly sets ARITHABORT to ON when the database compatibility level is set to 90 or higher. Si el nivel de compatibilidad de base de datos se establece en 80 o menos, la opción ARITHABORT debe establecerse explícitamente en ON.If the database compatibility level is set to 80 or earlier, the ARITHABORT option must be explicitly set to 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 ServerSQL Server inserta o actualiza un valor NULL.During expression evaluation when SET ARITHABORT is OFF, if an INSERT, DELETE or UPDATE statement encounters an arithmetic error, overflow, divide-by-zero, or a domain error, SQL ServerSQL Server inserts or updates a NULL value. 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.If the target column is not nullable, the insert or update action fails and the user receives an error.

Si SET ARITHABORT o SET ARITHIGNORE es OFF y SET ANSI_WARNINGS es ON, SQL ServerSQL Server devolverá un mensaje de error cuando haya errores de división por cero o desbordamiento.If either SET ARITHABORT or SET ARITHIGNORE is OFF and SET ANSI_WARNINGS is ON, SQL ServerSQL Server still returns an error message when encountering divide-by-zero or overflow errors.

Si SET ARITHABORT se establece 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 ejecuta la rama FALSE.If SET ARITHABORT is set to OFF and an abort error occurs during the evaluation of the Boolean condition of an IF statement, the FALSE branch is executed.

SET ARITHABORT también debe ser ON al crear o cambiar índices en columnas calculadas o vistas indizadas.SET ARITHABORT must be ON when you are creating or changing indexes on computed columns or indexed views. 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.If SET ARITHABORT is OFF, CREATE, UPDATE, INSERT, and DELETE statements on tables with indexes on computed columns or indexed views will fail.

La opción SET ARITHABORT se establece en tiempo de ejecución, no en tiempo de análisis.The setting of SET ARITHABORT is set at execute or run time and not at parse time.

Para ver la configuración actual de esta configuración, ejecute la consulta siguiente:To view the current setting for this setting, run the following query:

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

PermissionsPermissions

Debe pertenecer al rol public .Requires membership in the public role.

EjemplosExamples

En este ejemplo se muestran errores de división por cero y desbordamiento con las dos opciones de SET ARITHABORT.The following example demonstrates the divide-by-zero and overflow errors that have both SET ARITHABORT settings.

-- 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énSee Also

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