SET SET ARITHABORT (Transact-SQL)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsPiattaforma di analisi (PDW)Endpoint di analisi SQL in Microsoft FabricMagazzino in Microsoft FabricDatabase SQL 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 relative alla 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

Osservazioni:

Imposta ARITHABORT sempre su ON nelle sessioni di accesso. Impostare ARITHABORT su OFF può influire negativamente sull'ottimizzazione delle query, portando a problemi di prestazioni.

Avviso

L'impostazione predefinita ARITHABORT per SQL Server Management Studio è ATTIVATA. Le applicazioni client impostate ARITHABORT su OFF possono ricevere piani di query diversi, rendendo difficile risolvere query con scarse prestazioni. In altre parole, la stessa query potrebbe essere eseguita rapidamente in Management Studio, ma lentamente nell'applicazione. Quando si risolvono query con Management Studio, abbina sempre le impostazioni del client ARITHABORT .

Quando SET ARITHABORT e SET ANSI WARNINGS sono ATTIVI, queste condizioni di errore fanno terminare la query.

Quando SET ARITHABORT è ACCESO e SET ANSI WARNINGS è OFF, queste condizioni di errore fanno terminare il batch. Se gli errori si verificano in una transazione, viene eseguito il rollback della transazione. Quando SETSET ARITHABORT è OFF e si verifica uno di questi errori, appare un messaggio di avviso e il risultato dell'operazione aritmetica è NULL.

Se SET ARITHABORT e SET ANSI WARNINGS sono OFF e si verifica uno di questi errori, appare un messaggio di avviso e il risultato dell'operazione aritmetica è NULL.

Nota

Se nessuno SET ARITHABORTSETSET ARITHIGNORE dei due è attivo, SQL Server restituisce NULL e appare un messaggio di avviso dopo l'esecuzione della query.

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

Per la valutazione delle espressioni, se SET ARITHABORT è OFF e si imbatte in DELETEINSERTUPDATEun errore aritmetico, di overflow, di divisione per zero o di dominio, SQL Server inserisce o aggiorna un NULL valore. 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.

Quando uno dei SET ARITHABORTSETSET ARITHIGNORE due è OFF ed SETSET ANSI_WARNINGS è ON, SQL Server restituisce comunque un messaggio di errore quando si incontrano errori di divisione per zero o di overflow.

Quando SETSET ARITHABORT è OFF e si verifica un errore di aborto durante la valutazione della condizione booleana di un'istruzione IF, il branch FALSE viene eseguito.

SET SET ARITHABORT deve essere ATTIVO quando crei o modifichi indici su colonne calcolate o viste indicizzate. Se SET ARITHABORT è OFF, CREATE, UPDATE, INSERT, e DELETE le istruzioni su tabelle con indici su colonne calcolate o viste indicizzate falliscono.

L'impostazione di SETSET ARITHABORT avviene a tempo di esecuzione o di esecuzione e non a tempo di analisi.

SET SET ARITHABORTOFF non è supportato nei pool SQL dedicati di Azure Synapse Analytics.

Per visualizzare l'impostazione corrente per SETSET ARITHABORT, esegui la seguente inquisizione:

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