Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Azure SQL Database
Instancia administrada de Azure SQL
Azure Synapse Analytics
Analytics Platform System (PDW)
Punto de conexión de SQL Analytics en Microsoft Fabric
Almacén en Microsoft Fabric
Base de datos SQL en Microsoft Fabric
La SET ARITHABORT configuración determina si una consulta se detiene cuando ocurre un error de desbordamiento o de división por cero durante la ejecución de la consulta.
Cuando configuras
SET ARITHABORT ONySET ANSI_WARNINGS OFF, errores aritméticos hacen que el lote termine. Si los errores se producen en una transacción, ésta se revierte.Si tanto
SET ARITHABORTsonSET ANSI_WARNINGSOFFcomo se produce un error aritmético, aparece un mensaje de advertencia (a menos queSET ARITHIGNOREseaON) y el resultado de la operación aritmética esNULL.
Convenciones de sintaxis de Transact-SQL
Sintaxis
Sintaxis para SQL Server, pool SQL serverless en Azure Synapse Analytics, Microsoft Fabric, base de datos SQL en Microsoft Fabric
SET ARITHABORT { ON | OFF }
Sintaxis para Azure Synapse Analytics y Sistema de la plataforma de análisis (PDW)
SET ARITHABORT ON
Comentarios
Cuando ANSI_WARNINGS es ON (el valor por defecto), el ajuste de ARITHABORT no tiene efecto funcional. Los errores aritméticos hacen que la consulta termine, pero el lote no aborta (siempre que la configuración XACT_ABORT sea OFF).
Advertencia
La configuración predeterminada ARITHABORT de SQL Server Management Studio (SSMS) es ON, mientras que una conexión cliente en una aplicación es predeterminada .ARITHABORT OFF Aunque no haya diferencia funcional mientras ANSI_WARNINGS lo sea ON, la ARITHABORT configuración sigue siendo una clave de caché. Por lo tanto, SSMS y una aplicación que usan sus respectivos valores predeterminados tienen entradas de caché diferentes y pueden recibir planes de consulta distintos, lo que dificulta la resolución de consultas con mal rendimiento. Es decir, la misma consulta podría ejecutarse más lentamente en la aplicación que en SSMS. Cuando resuelvas consultas con Management Studio, siempre coincide con la configuración del cliente ARITHABORT .
Para la evaluación de expresións, si tanto SET ANSI_WARNINGS son OFFSET ARITHABORT como una INSERTsentencia , UPDATE, o DELETE una sentencia se encuentran con un error aritmético, de desbordamiento, división por cero o de dominio, la consulta 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.
La configuración de SET ARITHABORT ocurre en tiempo de ejecución o ejecución y no en tiempo de análisis analquénico.
SET ARITHABORT OFFno está soportado en pools SQL dedicados de Azure Synapse Analytics.
Permisos
Debe pertenecer al rol public .
Ver configuración actual de ARITHABORT
Para ver la configuración actual de SET ARITHABORT, ejecuta la siguiente consulta T-SQL:
DECLARE @ARITHABORT VARCHAR(3) = 'OFF';
IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = 'ON';
SELECT @ARITHABORT AS ARITHABORT;
Ejemplos
El siguiente ejemplo demuestra los errores de división por cero y de desbordamiento con diferentes SET ARITHABORT configuraciones.
- El script crea tablas
t1de ejemplo et2inserta valores de datos de muestra. - Establece
ANSI_WARNINGS ONy ejecuta pruebas para ver el comportamiento por defecto de un error de división por cero y un desbordamiento aritmético. - Establece
ANSI_WARNINGS OFFque tieneARITHABORTefecto, y fijaARITHABORT ON. Haz pruebas para ver el comportamiento con un error de división por cero y un desbordamiento aritmético. - Establece tanto
ANSI_WARNINGS OFFcomoARITHABORT OFF. Haz pruebas para ver el comportamiento con un error de división por cero y un desbordamiento aritmético. - Limpia las tablas de muestras.
-- SET ARITHABORT
-------------------------------------------------------------------------------
-- Create tables t1 and t2 and insert data values.
CREATE TABLE t1 (
a TINYINT,
b TINYINT
);
CREATE TABLE t2 (
a TINYINT NOT NULL
);
GO
INSERT INTO t1
VALUES (1, 0);
INSERT INTO t1
VALUES (255, 1);
GO
-- First run with ANSI_WARNINGS ON to see the default behavior.
PRINT '*** SET ANSI_WARNINGS ON';
SET ANSI_WARNINGS ON;
SET XACT_ABORT OFF; -- To make sure that we have the default setting for this option.
GO
PRINT '*** Testing divide-by-zero during SELECT';
GO
SELECT a / b AS ab
FROM t1;
PRINT 'This prints, despite the error message.';
GO
PRINT '*** Testing divide-by-zero during INSERT';
GO
INSERT INTO t2
SELECT a / b AS ab
FROM t1;
PRINT 'This prints, despite the error message.';
GO
PRINT '*** Testing tinyint overflow';
GO
INSERT INTO t2
SELECT a + b AS ab
FROM t1;
PRINT 'This prints, despite the error message.';
GO
PRINT '*** Resulting data - should be no data';
GO
SELECT *
FROM t2;
GO
-- Truncate table t2.
TRUNCATE TABLE t2;
GO
-- Set ANSI_WARNINGS OFF so that ARITHABORT has effect, and set ARITHABORT ON.
PRINT '*** SET ANSI_WARNINGS OFF; SET ARITHABORT ON';
GO
SET ANSI_WARNINGS OFF;
SET ARITHABORT ON;
GO
PRINT '*** Testing divide-by-zero during SELECT';
GO
SELECT a / b AS ab
FROM t1;
PRINT 'This does not print.';
GO
PRINT '*** Testing divide-by-zero during INSERT';
GO
INSERT INTO t2
SELECT a / b AS ab
FROM t1;
PRINT 'This does not print.';
GO
PRINT '*** Testing tinyint overflow';
GO
INSERT INTO t2
SELECT a + b AS ab
FROM t1;
PRINT 'This does not print.';
GO
PRINT '*** Resulting data - should be 0 rows';
GO
SELECT *
FROM t2;
GO
-- Truncate table t2.
TRUNCATE TABLE t2;
GO
-- Set both ANSI_WARNINGS OFF and ARITHABORT OFF.
PRINT '*** SET ARITHABORT OFF';
GO
SET ARITHABORT OFF;
GO
PRINT '*** Testing divide-by-zero during SELECT';
GO
-- Returns NULL.
SELECT a / b AS ab
FROM t1;
GO
PRINT '*** Testing divide-by-zero during INSERT';
GO
-- Fails with NOT NULL violation.
INSERT INTO t2
SELECT a / b AS ab
FROM t1;
GO
PRINT '*** Testing tinyint overflow';
GO
-- Fails with NOT NULL violation
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 and restore ANSI_WARNINGS
DROP TABLE t1;
DROP TABLE t2;
SET ANSI_WARNINGS ON
GO