SET SET ARITHABORT (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Point de terminaison d’analytique SQL dans Microsoft FabricEntrepôt dans Microsoft FabricBase de données SQL dans Microsoft Fabric

Ce SET ARITHABORT paramètre détermine si une requête s’arrête lorsqu’une erreur de dépassement ou de division par zéro survient lors de l’exécution de la requête.

  • Lorsque vous définissez SET ARITHABORT ON et SET ANSI_WARNINGS OFF, des erreurs arithmétiques font que le lot se termine. Si l'erreur se produit dans une transaction, cette dernière est annulée.

  • Si et sont tous deux SET ARITHABORT et qu’une erreur arithmétique se produit, un message d’avertissement apparaît (sauf si SET ARITHIGNORE est ON) et le résultat de l’opération arithmétique est NULL.OFFSET ANSI_WARNINGS

Conventions de la syntaxe Transact-SQL

Syntaxe

Syntaxe pour SQL Server, pool SQL serverless dans Azure Synapse Analytics, Microsoft Fabric, base de données SQL dans Microsoft Fabric


SET ARITHABORT { ON | OFF }

Syntaxe pour Azure Synapse Analytics et Analytics Platform System (PDW)


SET ARITHABORT ON

Notes

Lorsque ANSI_WARNINGS est ON (le réglage par défaut), le paramètre de ARITHABORT n’a aucun effet fonctionnel. Des erreurs arithmétiques font que la requête se termine, mais le lot ne s’arrête pas (tant que le réglage XACT_ABORT est OFF).

Avertissement

Le paramètre par défaut ARITHABORT pour SQL Server Management Studio (SSMS) est ON, tandis qu’une connexion client dans une application est par défaut .ARITHABORT OFF Même s’il n’y a pas de différence fonctionnelle tant que ANSI_WARNINGS c’est ON, le ARITHABORT réglage reste une clé de cache. Ainsi, SSMS et une application utilisant chacun leurs valeurs par défaut ont des entrées de cache différentes et peuvent recevoir des plans de requête différents, ce qui rend difficile le dépannage des requêtes mal performantes. Autrement dit, la même requête peut s’exécuter plus lentement dans l’application que dans SSMS. Lorsque vous dépannez des requêtes avec Management Studio, correspondez toujours aux paramètres du client ARITHABORT .

Pour l’évaluation d’expression, si et sont tous deux SET ANSI_WARNINGS et une INSERTinstruction , UPDATE, ou DELETE une instruction rencontrent une erreur arithmétique, de débordement, de division par zéro ou de domaine, la requête insère ou met à jour une NULL valeur.OFFSET ARITHABORT Si la colonne cible ne peut pas prendre la valeur NULL, l'action d'insertion ou de mise à jour échoue et l'utilisateur voit une erreur.

Le réglage de SET ARITHABORT se produit à l’exécution ou à l’exécution, et non au moment de l’analyse.

SET ARITHABORT OFFn'est pas pris en charge par les pools SQL dédiés Azure Synapse Analytics.

Autorisations

Nécessite l'appartenance au rôle public .

Voir le cadre actuel de ARITHABORT

Pour voir le paramètre actuel de SET ARITHABORT, exécutez la requête T-SQL suivante :

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

Exemples

L’exemple suivant montre les erreurs de division par zéro et de dépassement avec différents SET ARITHABORT réglages.

  1. Le script crée des tables t1 d’exemple et t2 insère des valeurs de données d’exemple.
  2. Configurez ANSI_WARNINGS ON et exécutez des tests pour voir le comportement par défaut d’une erreur de division par zéro et d’un débordement arithmétique.
  3. On règle ANSI_WARNINGS OFF pour que ait ARITHABORT un effet, et on met ARITHABORT ON. Effectuez des tests pour voir le comportement avec une erreur de division par zéro et un débordement arithmétique.
  4. Posez à la fois ANSI_WARNINGS OFF et ARITHABORT OFF. Effectuez des tests pour voir le comportement avec une erreur de division par zéro et un débordement arithmétique.
  5. Range les tables d’échantillons.
-- 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