SET SET ARITHABORT (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsEndpoint de análise SQL no Microsoft FabricArmazém no Microsoft FabricBanco de dados SQL no Microsoft Fabric

A SET ARITHABORT configuração determina se uma consulta para quando ocorre um erro de transbordamento ou de divisão por zero durante a execução da consulta.

  • Quando você define SET ARITHABORT ON e SET ANSI_WARNINGS OFF, erros aritméticos fazem o lote terminar. Se ocorrer erro em uma transação, a transação será revertida.

  • Se tanto SET ARITHABORT quanto forem SET ANSI_WARNINGS e ocorrer um erro aritmético, aparece uma mensagem de aviso (a menos que OFF seja SET ARITHIGNORE) e o resultado da operação aritmética é ONNULL .

Convenções de sintaxe de Transact-SQL

Sintaxe

Sintaxe para SQL Server, pool SQL serverless em Azure Synapse Analytics, Microsoft Fabric, banco de dados SQL em Microsoft Fabric


SET ARITHABORT { ON | OFF }

Sintaxe do Azure Synapse Analytics


SET ARITHABORT ON

Comentários

Quando ANSI_WARNINGS é ON (o padrão), a configuração de ARITHABORT não tem efeito funcional. Erros aritméticos fazem a consulta terminar, mas o lote não aborta (desde que a configuração XACT_ABORT seja OFF). Erros aritméticos incluem transbordamento, divisão por zero ou erros de domínio.

Aviso

A configuração padrão ARITHABORT para SQL Server Management Studio (SSMS) é ON, enquanto uma conexão cliente em uma aplicação tem ARITHABORT OFFcomo padrão . Mesmo que não haja diferença funcional enquanto ANSI_WARNINGS for ON, a ARITHABORT configuração ainda é uma chave de cache. Portanto, o SSMS e uma aplicação usando seus respectivos padrões têm entradas de cache diferentes e podem receber planos de consulta distintos, dificultando a resolução de consultas com desempenho ruim. Ou seja, a mesma consulta pode ser executada mais lentamente na aplicação do que no SSMS. Ao resolver consultas com o Management Studio, sempre corresponda à configuração do cliente ARITHABORT .

Para avaliação de expressões, se tanto SET ANSI_WARNINGS e SET ARITHABORT são OFF quanto uma INSERT, UPDATE, ou DELETE instrução encontrarem um erro aritmético, a consulta insere ou atualiza um NULL valor. Se a coluna de destino não for anulável, a ação de inserção ou atualização falhará e o usuário receberá uma mensagem de erro.

A configuração de SET ARITHABORT acontece em tempo de execução ou execução, e não em tempo de análise.

SET ARITHABORT OFFnão é suportado em pools SQL dedicados do Azure Synapse Analytics.

Permissões

Requer associação à função pública .

Veja o cenário atual de ARITHABORT

Para visualizar a configuração atual para SET ARITHABORT, execute a seguinte consulta T-SQL:

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

Exemplos

O exemplo a seguir demonstra os erros de divisão por zero e de transbordo com configurações diferentes SET ARITHABORT .

  1. O script cria tabelas t1 de exemplo e t2 insere valores de dados de exemplo.
  2. Configure ANSI_WARNINGS ON e execute testes para ver o comportamento padrão de um erro de dividir por zero e um transbordamento aritmético.
  3. Defina ANSI_WARNINGS OFF para que tenha ARITHABORT efeito, e defina ARITHABORT ON. Execute testes para ver o comportamento com erro de divisão por zero e transbordamento aritmético.
  4. Defina tanto ANSI_WARNINGS OFF quanto ARITHABORT OFF. Execute testes para ver o comportamento com erro de divisão por zero e transbordamento aritmético.
  5. Limpe as tabelas de exemplo.
-- 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