SET ARITHABORT (Transact-SQL)

Si applica a:SQL Server database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics AnalyticsPlatform System (PDW)SQL analytics endpoint in Microsoft FabricWarehouse in Microsoft Fabric

Interrompe una query quando si verifica un errore di divisione per zero o di overflow durante l'esecuzione della query stessa.

Convenzioni di sintassi Transact-SQL

Sintassi

Sintassi per SQL Server, pool SQL serverless in Azure Synapse Analytics, Microsoft Fabric

SET ARITHABORT { ON | OFF }

Sintassi per Azure Synapse Analytics e piattaforma di strumenti analitici (PDW)

SET ARITHABORT ON

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere la documentazione delle versioni precedenti.

Osservazioni:

Impostare sempre ARITHABORT su ON nelle sessioni di accesso. L'impostazione di ARITHABORT su OFF può influire negativamente sull'ottimizzazione delle query causando problemi di prestazioni.

Avviso

L'impostazione predefinita di ARITHABORT per lo studio di gestione SQL Server è ON. Le applicazioni client che impostano l'opzione ARITHABORT su OFF potrebbero ricevere piani di query diversi e, di conseguenza, la risoluzione di errori di query con prestazioni scarse risulta difficile. In altre parole, la stessa query potrebbe essere eseguita rapidamente in Management Studio, ma lentamente nell'applicazione. Per la risoluzione dei problemi relativi alle query con Management Studio, far sempre corrispondere l'impostazione ARITHABORT del client.

Quando SET ARITHABORT e SET ANSI WARNINGS sono impostate su ON, queste condizioni di errore provocano l'interruzione della query.

Quando SET ARITHABORT è impostata su ON e SET ANSI WARNINGS su OFF, queste condizioni di errore provocano l'interruzione del batch. Se gli errori si verificano in una transazione, viene eseguito il rollback della transazione. Quando SET ARITHABORT è impostata su OFF e si verifica uno di questi errori, viene visualizzato un messaggio di avviso e il risultato dell'espressione aritmetica è NULL.

Quando SET ARITHABORT e SET ANSI WARNINGS sono impostate su OFF e si verifica uno di questi errori, viene visualizzato un messaggio di avviso e il risultato dell'operazione aritmetica è NULL.

Nota

Se entrambe le opzioni SET ARITHABORT e SET ARITHIGNORE non sono impostate su ON, dopo l'esecuzione della query, SQL Server restituisce NULL e un messaggio di avviso.

Quando ANSI_WARNINGS ha un valore ON e il livello di compatibilità del database è impostato su 90 o su un valore superiore, ARITHABORT è implicitamente ON indipendentemente dall'impostazione del valore. Se il livello di compatibilità del database è impostato su 80 o su un valore inferiore, l'opzione ARITHABORT deve essere impostata esplicitamente su ON.

Per la valutazione dell'espressione, se SET ARITHABORT è impostata su OFF e un'istruzione INSERT, UPDATE o DELETE rileva un errore aritmetico, di overflow, di divisione per zero o di dominio, SQL Server inserisce o aggiorna un valore NULL. Se la colonna di destinazione non ammette valori Null, l'operazione di inserimento o aggiornamento ha esito negativo e viene generato un errore per l'utente.

Se l'opzione SET ARITHABORT o SET ARITHIGNORE è impostata su OFF e l'opzione SET ANSI_WARNINGS è impostata su ON, SQL Server restituisce comunque un messaggio di errore quando si verificano errori di divisione per zero o di overflow.

Quando SET ARITHABORT è OFF e si verifica un errore di interruzione durante la valutazione della condizione booleana di un'istruzione IF, viene eseguito il segmento di codice associato alla valutazione FALSE.

È necessario che l'opzione SET ARITHABORT sia impostata su ON durante la creazione o la modifica di indici in colonne calcolate o viste indicizzate. Se l'opzione è impostata su OFF, le istruzioni CREATE, UPDATE, INSERT e DELETE eseguite sulle tabelle che includono indici in colonne calcolate o viste indicizzate hanno esito negativo.

L'opzione SET ARITHABORT viene impostata in fase di esecuzione, non in fase di analisi.

Per visualizzare l'impostazione corrente per SET ARITHABORT, eseguire la query riportata di seguito:

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

Autorizzazioni

È richiesta l'appartenenza al ruolo public .

Esempi

Nell'esempio seguente vengono illustrati gli errori di divisione per zero e gli errori di overflow con impostazioni 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  

Vedi anche

Istruzioni edizione Standard T (Transact-SQL)
edizione Standard T ARITHIGNORE (Transact-SQL)
edizione Standard SSIONPROPERTY (Transact-SQL)