Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Base de Dados SQL do Azure
Instância Gerida do Azure SQL
Azure Synapse Analytics
Sistema de Plataforma de Análise (PDW)
Ponto de Extremidade de Análise SQL no Microsoft Fabric
Armazém no Microsoft Fabric
Base 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 ONeSET 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 ARITHABORTforemSET ANSI_WARNINGSOFFe ocorrer um erro aritmético, aparece uma mensagem de aviso (a menos queSET ARITHIGNOREsejaON) 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 }
Syntax for Azure Synapse Analytics and Analytics Platform System (PDW)
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).
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 a avaliação de expressões, se tanto SET ANSI_WARNINGS são OFFSET ARITHABORT como uma INSERTinstrução , UPDATE, ou DELETE uma instrução encontrarem um erro aritmético, de overflow, de divisão por zero ou de domínio, a consulta 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.
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.
- O script cria tabelas
t1de exemplo et2insere valores de dados de exemplo. - Configure
ANSI_WARNINGS ONe execute testes para ver o comportamento padrão de um erro de divisão por zero e um transbordamento aritmético. - Defina
ANSI_WARNINGS OFFpara que tenhaARITHABORTefeito, e definaARITHABORT ON. Faz testes para ver o comportamento com um erro de divisão por zero e um excesso aritmético. - Defina tanto
ANSI_WARNINGS OFFcomoARITHABORT OFF. Faz testes para ver o comportamento com um erro de divisão por zero e um excesso aritmético. - 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