SET ARITHABORT (Transact-SQL)
Encerra uma consulta quando ocorre estouro ou erro de divisão por zero durante a execução da consulta.
Aplica-se a: SQL Server (SQL Server 2008 até a versão atual), Banco de dados SQL do Windows Azure (versão inicial até a versão atual). |
Convenções da sintaxe Transact-SQL
Sintaxe
SET ARITHABORT { ON | OFF }
[ ; ]
Comentários
Você sempre deve definir ARITHABORT como ON nas sessões de logon. A definição de ARITHABORT como OFF pode afetar negativamente a otimização da consulta, resultando em 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.
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.
Se SET ARITHABORT for OFF e SET ANSI WARNINGS for OFF, e um desses erros ocorrer, será exibida uma mensagem de aviso, e NULL será atribuído ao resultado da operação aritmética.
Dica
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 definição de ANSI_WARNINGS como ON definirá ARITHABORT implicitamente como ON quando o nível de compatibilidade do banco de dados estiver definido como 90 ou mais. 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 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.
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 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 dessa configuração, execute a consulta a seguir.
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 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