Partilhar via


SET ARITHABORT (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics PDW (Analytics Platform System) Ponto de extremidade de análise do SQL Warehouse no Microsoft Fabric

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

Convenções de sintaxe de Transact-SQL

Sintaxe

Sintaxe para SQL Server, Pool de SQL sem servidor no Azure Synapse Analytics, Microsoft Fabric

SET ARITHABORT { ON | OFF }

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

SET ARITHABORT ON

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 de ARITHABORT para o 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 o 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 SET ARITHABORT está OFF e ocorre um desses erros, uma mensagem de aviso é exibida e o resultado da operação aritmética é NULL.

Se SET ARITHABORT e SET ANSI WARNINGS estiverem OFF e ocorrer um desses erros, uma mensagem de aviso será exibida e o resultado da operação aritmética será NULL.

Observação

Se nem SET ARITHABORT nem SET ARITHIGNORE estiverem ON, o SQL Server retornará NULL e uma mensagem de aviso será 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.

Para avaliação de expressão, se SET ARITHABORT estiver OFF e uma instrução INSERT, UPDATE ou DELETE encontrar um erro aritmético, de estouro, de divisão por zero ou de domínio, o SQL Server inserirá ou atualizará 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.

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

Não há suporte para SET ARITHABORT OFF nos pools de SQL dedicados do Azure Synapse Analytics.

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