Partilhar via


SET ARITHABORT (Transact-SQL)

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

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

SET ARITHABORT { ON | OFF }
[ ; ]

Comentários

Se SET ARITHABORT for ON e SET ANSI WARNINGS for ON, essas condições de erro provocam o encerramento da consulta. Se SET ARITHABORT for ON e SET ANSI WARNINGS for OFF, essas condições de erro provocam o encerramento do lote. Se ocorrer erro em uma transação, a transação será revertida. Se SET ARITHABORT for OFF e ocorrer um desses erros, será exibida uma mensagem de aviso e NULL será atribuído ao resultado da operação aritmética.

ObservaçãoObservação

Se nem a propriedade SET ARITHABORT e nem SET ARITHIGNORE forem definidas, o SQL Server retornará NULL e uma mensagem de aviso após a execução da consulta.

A configuração de ANSI_WARNINGS como ON define implicitamente ARITHABORT como ON quando o nível de compatibilidade do banco de dados estiver definido como 90. 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.

Durante a avaliação da expressão, se SET ARITHABORT for OFF e se uma instrução INSERT, DELETE ou UPDATE encontrar um erro aritmético, de estouro, de divisão por zero ou de domínio, o SQL Server inserirá ou atualizará um valor NULL. Se a coluna designada não for anulável, a ação de inserção ou atualização falhará e o usuário receberá um 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.

Se SET ARITHABORT for definida como OFF e ocorrer um erro de interrupção durante a avaliação da condição Booleana de uma instrução IF, a ramificação FALSE será executada.

SET ARITHABORT deve ser ON quando você estiver criando ou alterando índices em colunas computadas ou exibições indexadas. Se SET ARITHABORT for OFF, toda instrução CREATE, UPDATE, INSERT e DELETE das tabelas com índices em colunas computadas ou exibição indexada falhará. Para obter mais informações sobre as configurações da opção SET com exibições e índices indexados em colunas computadas, consulte Opções SET que afetam os resultados.

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

Permissões

Exige associação à função public.

Exemplos

O exemplo seguinte demonstra erros de divisão por zero e de estouro com as duas 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