Partilhar via


SET ARITHABORT (Transact-SQL)

Aplica-se a:SQL ServerBase de Dados SQL do AzureInstância Gerida do Azure SQLAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Ponto de Extremidade de Análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de Dados SQL no Microsoft Fabric

Termina uma consulta quando ocorre um erro de desbordamento ou divisão por zero durante a execução da consulta.

Transact-SQL convenções de sintaxe

Sintaxe

Syntax for SQL Server, server less SQL pool in Azure Synapse Analytics, Microsoft Fabric

SET ARITHABORT { ON | OFF }

Syntax for Azure Synapse Analytics and Analytics Platform System (PDW)

SET ARITHABORT ON

Observações

Define sempre o ARITHABORT como ON nas tuas sessões de logon. Definir o ARITHABORT para OFF pode afetar negativamente a otimização das consultas, levando a problemas de desempenho.

Advertência

A definição padrão ARITHABORT para SQL Server Management Studio está ATIVADA. Aplicações cliente que definem o ARITHABORT para OFF podem receber planos de consulta diferentes, dificultando a resolução de problemas de consultas com mau desempenho. Ou seja, a mesma consulta pode ser executada rapidamente no Management Studio mas lenta na aplicação. Ao resolver consultas com o Management Studio, corresponda sempre à definição ARITHABORT do cliente.

Quando os avisos SET ARITHABORT e SET ANSI estão ATIVADOS, estas condições de erro fazem com que a consulta termine.

Quando o SET ARITHABORT está LIGADO e SET ANSI WARNINGS está DESLIGADO, estas condições de erro fazem com que o lote termine. Se os erros ocorrerem numa transação, a transação é revertida. Quando SET ARITHABORT está DESLIGADO e ocorre um destes erros, aparece uma mensagem de aviso e o resultado da operação aritmética é NULL.

Se SET ARITHABORT e SET ANSI WARNINGS estiverem DESLIGADOS e um destes erros ocorrer, aparece uma mensagem de aviso, e o resultado da operação aritmética é NULL.

Observação

Se nem SET ARITHABORT nem SET ARITHIGNORE estiverem ATIVADOS, o SQL Server retorna NULL e aparece uma mensagem de aviso após a execução da consulta.

Quando ANSI_WARNINGS tem um valor ON e o nível de compatibilidade da base de dados está definido para 90 ou superior, então ARITHABORT está implicitamente ON, independentemente da sua definição de valor. Se o nível de compatibilidade da base de dados estiver definido como 80 ou anterior, a opção ARITHABORT deve ser explicitamente definida como ON.

Para avaliação de expressões, se SET ARITHABORT estiver DESLIGADO e uma instrução INSERT, UPDATE ou DELETE encontrar um erro aritmético, de overflow, de divisão por zero ou de domínio, o SQL Server insere ou atualiza um NULL valor. Se a coluna de destino não for anulável, a ação de inserir ou atualizar falha e o utilizador vê um erro.

Quando SET ARITHABORT ou SET ARITHIGNORE está DESLIGADO e SET ANSI_WARNINGS está LIGADO, o SQL Server continua a devolver uma mensagem de erro ao encontrar erros de dividir por zero ou de overflow.

Quando SET ARITHABORT está DESLIGADO e ocorre um erro de abort durante a avaliação da condição booleana de uma instrução IF, o desvio FALSE é executado.

SET ARITHABORT deve estar LIGADO quando está a criar ou alterar índices em colunas computadas ou vistas indexadas. Se SET ARITHABORT estiver desligado, as instruções create, update, insert e DELETE em tabelas com índices em colunas computadas ou vistas indexadas falham.

A definição de SET ARITHABORT ocorre em tempo de execução ou execução e não em tempo de análise.

SET ARITHABORT OFF não é suportado em pools SQL dedicados do Azure Synapse Analytics.

Para visualizar a definição atual para SET ARITHABORT, execute a seguinte consulta:

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

Permissions

Requer adesão à função pública de .

Examples

O exemplo seguinte demonstra os erros de divisão por zero e de overflow que têm SET ARITHABORT definições.

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