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

SE APLICA A: síSQL Server síAzure SQL Database síAzure Synapse Analytics (SQL DW) síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Termina una consulta cuando se produce un error de desbordamiento o división por cero durante su ejecución.Ends 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

NotasRemarks

Establezca siempre ARITHABORT en ON en las sesiones de inicio de sesión.Always set ARITHABORT to ON in your logon sessions. Establecer ARITHABORT en OFF puede afectar negativamente a la optimización de consultas, lo que produce 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 podrían 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 might receive different query plans, making it difficult to troubleshoot poorly performing queries. Es decir, la misma consulta podría ejecutarse más deprisa en Management Studio y más despacio en la aplicación.That is, the same query might 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 y SET ANSI WARNINGS son ON, estas condiciones de error pueden terminar una consulta.When SET ARITHABORT and SET ANSI WARNINGS are ON, these error conditions cause the query to end.

Si SET ARITHABORT es ON y SET ANSI WARNINGS es OFF, estas condiciones de error pueden cancelar un lote.When SET ARITHABORT is ON and SET ANSI WARNINGS is OFF, these error conditions cause the batch to end. 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.When SET ARITHABORT is OFF and one of these errors occurs, a warning message appears and the result of the arithmetic operation is NULL.

Si SET ARITHABORT y SET ANSI WARNINGS son 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 and SET ANSI WARNINGS are OFF and one of these errors occurs, a warning message appears, and the result of the arithmetic operation is NULL.

Nota

Si ni SET ARITHABORT ni SET ARITHIGNORE son ON, 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 ON, SQL ServerSQL Server returns NULL and a warning message appears after the query runs.

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 la base de datos está establecido en 80 o en un nivel inferior, debe configurarse explícitamente la opción ARITHABORT 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.For expression evaluation, if SET ARITHABORT is OFF and an INSERT, UPDATE, or DELETE statement comes across an arithmetic, overflow, divide-by-zero, or 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 isn't nullable, the insert or update action fails and the user sees 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.When 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 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.When SET ARITHABORT is OFF and an abort error occurs during the evaluation of the Boolean condition of an IF statement, the FALSE branch executes.

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're 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 fail.

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

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

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

PermisosPermissions

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 opciones de SET ARITHABORT.The following example demonstrates the divide-by-zero and overflow errors that have 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  

Consulte 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)