SET SET ARITHABORT (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseInstancia administrada de Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Punto de conexión de SQL Analytics en Microsoft FabricAlmacén en Microsoft FabricBase 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 ON y SET 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 ARITHABORT son SET ANSI_WARNINGSOFF como se produce un error aritmético, aparece un mensaje de advertencia (a menos que SET ARITHIGNORE sea ON) y el resultado de la operación aritmética es NULL.

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.

  1. El script crea tablas t1 de ejemplo e t2 inserta valores de datos de muestra.
  2. Establece ANSI_WARNINGS ON y ejecuta pruebas para ver el comportamiento por defecto de un error de división por cero y un desbordamiento aritmético.
  3. Establece ANSI_WARNINGS OFF que tiene ARITHABORT efecto, y fija ARITHABORT ON. Haz pruebas para ver el comportamiento con un error de división por cero y un desbordamiento aritmético.
  4. Establece tanto ANSI_WARNINGS OFF como ARITHABORT OFF. Haz pruebas para ver el comportamiento con un error de división por cero y un desbordamiento aritmético.
  5. 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