SET SET ARITHABORT (Transact-SQL)

Aplica-se a:SQL ServerBase de Dados SQL do AzureAzure SQL Managed InstanceAzure Synapse AnalyticsEndpoint de análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de dados SQL no Microsoft Fabric

A SET ARITHABORT definição determina se uma consulta para quando ocorre um erro de overflow ou de divisão por zero durante a execução da consulta.

  • Quando defines SET ARITHABORT ON e SET ANSI_WARNINGS OFF, erros aritméticos fazem com que o lote termine. Se os erros ocorrerem numa transação, a transação é revertida.

  • Se ambos SET ARITHABORT forem SET ANSI_WARNINGSOFF e ocorrer um erro aritmético, aparece uma mensagem de aviso (a menos que SET ARITHIGNORE seja ON) e o resultado da operação aritmética é NULL.

Transact-SQL convenções de sintaxe

Sintaxe

Sintaxe para SQL Server, pool SQL serverless em Azure Synapse Analytics, Microsoft Fabric, base de dados SQL em Microsoft Fabric


SET ARITHABORT { ON | OFF }

Sintaxe para o Azure Synapse Analytics


SET ARITHABORT ON

Observações

Quando ANSI_WARNINGS é ON (o padrão), a definição de ARITHABORT não tem efeito funcional. Erros aritméticos fazem com que a consulta termine, mas o lote não aborta (desde que a definição XACT_ABORT seja OFF). Erros aritméticos incluem excesso, divisão por zero ou erros de domínio.

Advertência

A definição padrão ARITHABORT para o SQL Server Management Studio (SSMS) é ON, enquanto uma ligação cliente numa aplicação tem ARITHABORT OFFpor defeito . Mesmo que não haja diferença funcional desde ANSI_WARNINGS que seja ON, a ARITHABORT definição continua a ser uma chave de cache. Assim, o SSMS e uma aplicação, ambos usando os seus respetivos predefinidos, têm entradas de cache diferentes e podem receber planos de consulta distintos, tornando difícil a resolução de consultas com mau desempenho. Ou seja, a mesma consulta pode ser executada mais lentamente na aplicação do que no SSMS. Ao resolver consultas com o Management Studio, corresponda sempre à definição do cliente ARITHABORT .

Para avaliação de expressões, se tanto SET ANSI_WARNINGS e forem SET ARITHABORT como uma OFF, INSERT, ou UPDATE uma instrução encontrarem um erro aritmético, a consulta insere ou atualiza um DELETE valor.NULL Se a coluna de destino não for anulável, a ação de inserir ou atualizar falha e o utilizador vê um erro.

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

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

Permissions

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

Ver configuração atual de ARITHABORT

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

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

Examples

O exemplo seguinte demonstra os erros de divisão por zero e de overflow com diferentes SET ARITHABORT definições.

  1. O script cria tabelas t1 de exemplo e t2 insere valores de dados de exemplo.
  2. Configure ANSI_WARNINGS ON e execute testes para ver o comportamento padrão de um erro de divisão por zero e um transbordamento aritmético.
  3. Defina ANSI_WARNINGS OFF para que tenha ARITHABORT efeito, e defina ARITHABORT ON. Faz testes para ver o comportamento com um erro de divisão por zero e um excesso aritmético.
  4. Defina tanto ANSI_WARNINGS OFF como ARITHABORT OFF. Faz testes para ver o comportamento com um erro de divisão por zero e um excesso aritmético.
  5. Limpa as tabelas de exemplo.
-- SET ARITHABORT  
-------------------------------------------------------------------------------  
-- Create tables t1 and t2 and insert data values.  
CREATE TABLE t1 (  
   a TINYINT,   
   b TINYINT  
);  
CREATE TABLE t2 (  
   a TINYINT NOT NULL  
);  
GO  
INSERT INTO t1   
VALUES (1, 0);  
INSERT INTO t1   
VALUES (255, 1);  
GO  

-- First run with ANSI_WARNINGS ON to see the default behavior.
PRINT '*** SET ANSI_WARNINGS ON';  
SET ANSI_WARNINGS ON;
SET XACT_ABORT OFF;    -- To make sure that we have the default setting for this option.  
GO
PRINT '*** Testing divide-by-zero during SELECT';  
GO  
SELECT a / b AS ab   
FROM t1;  
PRINT 'This prints, despite the error message.';
GO  

PRINT '*** Testing divide-by-zero during INSERT';  
GO  
INSERT INTO t2  
SELECT a / b AS ab    
FROM t1;  
PRINT 'This prints, despite the error message.';
GO  

PRINT '*** Testing tinyint overflow';  
GO  
INSERT INTO t2  
SELECT a + b AS ab   
FROM t1;  
PRINT 'This prints, despite the error message.';
GO  

PRINT '*** Resulting data - should be no data';  
GO  
SELECT *   
FROM t2;  
GO  

-- Truncate table t2.  
TRUNCATE TABLE t2;  
GO  

-- Set ANSI_WARNINGS OFF so that ARITHABORT has effect, and set ARITHABORT ON.
PRINT '*** SET ANSI_WARNINGS OFF; SET ARITHABORT ON';  
GO  
SET ANSI_WARNINGS OFF; 
SET ARITHABORT ON;  
GO  

PRINT '*** Testing divide-by-zero during SELECT';  
GO  
SELECT a / b AS ab    
FROM t1;  
PRINT 'This does not print.';
GO  

PRINT '*** Testing divide-by-zero during INSERT';  
GO  
INSERT INTO t2  
SELECT a / b AS ab    
FROM t1;  
PRINT 'This does not print.';
GO  
PRINT '*** Testing tinyint overflow';  
GO  
INSERT INTO t2  
SELECT a + b AS ab   
FROM t1;  
PRINT 'This does not print.';
GO  

PRINT '*** Resulting data - should be 0 rows';  
GO  
SELECT *   
FROM t2;  
GO  

-- Truncate table t2.  
TRUNCATE TABLE t2;  
GO  

-- Set both ANSI_WARNINGS OFF and ARITHABORT OFF.
PRINT '*** SET ARITHABORT OFF';  
GO  
SET ARITHABORT OFF;  
GO  

PRINT '*** Testing divide-by-zero during SELECT';  
GO  
-- Returns NULL.
SELECT a / b AS ab    
FROM t1;  
GO  

PRINT '*** Testing divide-by-zero during INSERT';  
GO  
-- Fails with NOT NULL violation.
INSERT INTO t2  
SELECT a / b AS ab    
FROM t1;  
GO  
PRINT '*** Testing tinyint overflow';  
GO  
-- Fails with NOT NULL violation
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 and restore ANSI_WARNINGS
DROP TABLE t1;  
DROP TABLE t2;  
SET ANSI_WARNINGS ON
GO