SET ARITHABORT (Transact-SQL)SET ARITHABORT (Transact-SQL)

SI APPLICA A: sìSQL Server sìDatabase SQL di Azure sìAzure SQL Data Warehouse sìParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Interrompe una query quando si verifica un errore di divisione per zero o di overflow durante l'esecuzione della query stessa.Ends a query when an overflow or divide-by-zero error occurs during query execution.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintassiSyntax

-- Syntax for SQL Server and Azure SQL Database
  
SET ARITHABORT { ON | OFF }
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse

SET ARITHABORT ON

RemarksRemarks

Impostare sempre ARITHABORT su ON nelle sessioni di accesso.Always set ARITHABORT to ON in your logon sessions. L'impostazione di ARITHABORT su OFF può influire negativamente sull'ottimizzazione delle query causando problemi di prestazioni.Setting ARITHABORT to OFF can negatively impact query optimization, leading to performance issues.

Avviso

L'impostazione ARITHABORT predefinita per SQL Server Management StudioSQL Server Management Studio è ON.The default ARITHABORT setting for SQL Server Management StudioSQL Server Management Studio is 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.Client applications setting ARITHABORT to OFF might receive different query plans, making it difficult to troubleshoot poorly performing queries. In altre parole, la stessa query potrebbe essere eseguita rapidamente in Management Studio, ma lentamente nell'applicazione.That is, the same query might execute fast in management studio but slow in the application. Per la risoluzione dei problemi relativi alle query con Management StudioManagement Studio, far sempre corrispondere l'impostazione ARITHABORT del client.When troubleshooting queries with Management StudioManagement Studio, always match the client ARITHABORT setting.

Quando SET ARITHABORT e SET ANSI WARNINGS sono impostate su ON, queste condizioni di errore provocano l'interruzione della query.When SET ARITHABORT and SET ANSI WARNINGS are ON, these error conditions cause the query to end.

Quando SET ARITHABORT è impostata su ON e SET ANSI WARNINGS su OFF, queste condizioni di errore provocano l'interruzione del batch.When SET ARITHABORT is ON and SET ANSI WARNINGS is OFF, these error conditions cause the batch to end. Se gli errori si verificano in una transazione, viene eseguito il rollback della transazione.If the errors occur in a transaction, the transaction is rolled back. 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.When SET ARITHABORT is OFF and one of these errors occurs, a warning message appears and the result of the arithmetic operation is 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.If SET ARITHABORT and SET ANSI WARNINGS are OFF and one of these errors occurs, a warning message appears, and the result of the arithmetic operation is NULL.

Nota

Se entrambe le opzioni SET ARITHABORT e SET ARITHIGNORE non sono impostate su ON, dopo l'esecuzione della query SQL ServerSQL Server restituisce NULL e un messaggio di avviso.If neither SET ARITHABORT nor SET ARITHIGNORE is ON, SQL ServerSQL Server returns NULL and a warning message appears after the query runs.

Quando il livello di compatibilità del database è impostato su 90 o su un valore maggiore, l'impostazione di ANSI_WARNINGS su ON comporta anche l'impostazione implicita di ARITHABORT su ON.Setting ANSI_WARNINGS to ON implicitly sets ARITHABORT to ON when the database compatibility level is set to 90 or higher. Se il livello di compatibilità del database è impostato su 80 o su un valore inferiore, l'opzione ARITHABORT deve essere impostata esplicitamente su ON.If the database compatibility level is set to 80 or earlier, the ARITHABORT option must be explicitly set to 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 ServerSQL Server inserisce o aggiorna un valore NULL.For expression evaluation, if SET ARITHABORT is OFF and an INSERT, UPDATE, or DELETE statement comes across an arithmetic, overflow, divide-by-zero, or domain error, SQL ServerSQL Server inserts or updates a NULL value. 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.If the target column isn't nullable, the insert or update action fails and the user sees an error.

Quando SET ARITHABORT o SET ARITHIGNORE è impostata su OFF e SET ANSI_WARNINGS è impostata su ON, SQL ServerSQL Server restituisce comunque un messaggio di errore quando si verificano errori di divisione per zero o di overflow.When either SET ARITHABORT or SET ARITHIGNORE is OFF and SET ANSI_WARNINGS is ON, SQL ServerSQL Server still returns an error message when encountering divide-by-zero or overflow errors.

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.When SET ARITHABORT is OFF and an abort error occurs during the evaluation of the Boolean condition of an IF statement, the FALSE branch executes.

È necessario che l'opzione SET ARITHABORT sia impostata su ON durante la creazione o la modifica di indici in colonne calcolate o viste indicizzate.SET ARITHABORT must be ON when you're creating or changing indexes on computed columns or indexed views. 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.If SET ARITHABORT is OFF, CREATE, UPDATE, INSERT, and DELETE statements on tables with indexes on computed columns or indexed views fail.

L'opzione SET ARITHABORT viene impostata in fase di esecuzione, non in fase di analisi.The setting of SET ARITHABORT happens at execute or run time and not at parse time.

Per visualizzare l'impostazione corrente per SET ARITHABORT, eseguire la query riportata di seguito:To view the current setting for SET ARITHABORT, run the following query:

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

AutorizzazioniPermissions

È richiesta l'appartenenza al ruolo public .Requires membership in the public role.

EsempiExamples

Nell'esempio seguente vengono illustrati gli errori di divisione per zero e gli errori di overflow con impostazioni SET ARITHABORT.The following example demonstrates the divide-by-zero and overflow errors that have SET ARITHABORT settings.

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

Vedere ancheSee Also

Istruzioni SET (Transact-SQL) SET Statements (Transact-SQL)
SET ARITHIGNORE (Transact-SQL) SET ARITHIGNORE (Transact-SQL)
SESSIONPROPERTY (Transact-SQL)SESSIONPROPERTY (Transact-SQL)