SET SET ARITHABORT (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)Ponto de extremidade de análise de SQL no Microsoft FabricDepósito 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 OFF e ocorrer um erro aritmético, aparece uma mensagem de aviso (a menos que SET ARITHIGNORE seja ON) e o resultado da operação aritmética é NULLSET ANSI_WARNINGS .

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 para Azure Synapse Analytics e PDW (Analytics Platform System)


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

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 e são quanto uma INSERTinstrução , UPDATE, ou DELETE encontrar um erro aritmético, de transbordamento, divisão por zero ou domínio, a consulta insere ou atualiza um NULL valor.OFFSET ARITHABORTSET ANSI_WARNINGS 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