SET ARITHABORT (Transact-SQL)

Aplica-se a: simSQL Server (todas as versões compatíveis) SimBanco de Dados SQL do Azure SimInstância Gerenciada do Azure SQL simAzure Synapse Analytics simParallel Data Warehouse

Encerra uma consulta quando ocorre estouro ou erro de divisão por zero durante a execução da consulta.

Ícone de link do tópico Convenções da sintaxe Transact-SQL

Sintaxe

Sintaxe para SQL Server e Pool de SQL sem servidor no Azure Synapse Analytics

SET ARITHABORT { ON | OFF }

Sintaxe para Azure Synapse Analytics e PDW (Analytics Platform System)

SET ARITHABORT ON

Observação

Para ver a sintaxe do Transact-SQL para o SQL Server 2014 e versões anteriores, confira a Documentação das versões anteriores.

Comentários

Sempre defina ARITHABORT como ON nas sessões de logon. A definição de ARITHABORT como OFF pode afetar negativamente a otimização de consulta, levando a problemas de desempenho.

Aviso

A configuração padrão ARITHABORT de SQL Server Management Studio é ON. Os aplicativos cliente que definem ARITHABORT como OFF podem receber planos de consulta diferentes, dificultando a solução de problemas de consultas executadas insatisfatoriamente. Ou seja, a mesma consulta pode ser executada rapidamente no Management Studio, mas lentamente no aplicativo. Ao solucionar problemas de consultas com Management Studio, sempre faça a correspondência com a configuração ARITHABORT do cliente.

Quando as opções SET ARITHABORT e SET ANSI WARNINGS são definidas como ON, essas condições de erro provocam o encerramento da consulta.

Quando as opções SET ARITHABORT e SET ANSI WARNINGS são definidas como OFF, essas condições de erro provocam o encerramento do lote. Se ocorrer erro em uma transação, a transação será revertida. Quando a opção SET ARITHABORT é definida como OFF e um desses erros ocorre, uma mensagem de aviso aparece e o resultado da operação aritmética é NULL.

Se as opções SET ARITHABORT e SET ANSI WARNINGS estão definidas como OFF e um desses erros ocorre, uma mensagem de aviso é exibida e o resultado da operação aritmética é NULL.

Observação

Se nem SET ARITHABORT e nem SET ARITHIGNORE estão definidas como ON, o SQL Server retorna NULL e uma mensagem de aviso é exibida após a execução da consulta.

Quando ANSI_WARNINGS tem um valor igual a ON e o nível de compatibilidade do banco de dados é definido como 90 ou superior, ARITHABORT está implicitamente ATIVADO, independentemente da configuração do valor. Se o nível de compatibilidade do banco de dados for definido como 80 ou menos, a opção ARITHABORT deverá ser definida explicitamente como ON.

Na avaliação da expressão, se SET ARITHABORT é OFF e se uma instrução INSERT, UPDATE ou DELETE encontra um erro aritmético, de estouro, de divisão por zero ou de domínio, o SQL Server insere ou atualiza um valor NULL. 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.

Quando SET ARITHABORT ou SET ARITHIGNORE estiver definida como OFF e SET ANSI_WARNINGS como ON, o SQL Server ainda retornará uma mensagem de erro quando encontrar erros de divisão por zero ou de estouro.

Quando a opção SET ARITHABORT for definida como OFF e ocorrer um erro de anulação durante a avaliação da condição booliana de uma instrução IF, o branch FALSE será executado.

SET ARITHABORT deve ser ON quando você estiver criando ou alterando índices em colunas computadas ou modos de exibição indexados. Se SET ARITHABORT for OFF, toda instrução CREATE, UPDATE, INSERT e DELETE das tabelas com índices em colunas computadas ou modos de exibição indexados falhará.

A configuração de SET ARITHABORT é definida no momento da execução e não no momento da análise.

Para exibir a configuração atual de SET ARITHABORT, execute a seguinte consulta:

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

Permissões

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

Exemplos

O exemplo seguinte demonstra erros de divisão por zero e de estouro com as configurações de SET ARITHABORT.

-- 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 Também

Instruções SET (Transact-SQL)
SET ARITHIGNORE (Transact-SQL)
SESSIONPROPERTY (Transact-SQL)