Partage via


SET ARITHABORT (Transact-SQL)

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL analytics endpoint in Microsoft Fabric Warehouse in Microsoft Fabric

Arrête une requête lorsqu'un dépassement de capacité ou une division par zéro se produit durant son exécution.

Conventions de la syntaxe Transact-SQL

Syntaxe

Syntaxe pour SQL Server et Pool SQL serverless dans Azure Synapse Analytics, Microsoft Fabric

SET ARITHABORT { ON | OFF }

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

SET ARITHABORT ON

Notes

ARITHABORT doit toujours avoir la valeur ON dans vos sessions de connexion. L’affectation de la valeur OFF à ARITHABORT peut impacter l’optimisation des requêtes et entraîner des problèmes de performances.

Avertissement

Par défaut, le paramètre ARITHABORT pour SQL Server Management Studio est défini sur ON. Les applications clientes qui configurent ARITHABORT sur OFF peuvent recevoir des plans de requête différents, ce qui complique la résolution des celles dont les performances sont médiocres. Autrement dit, la même requête peut s'exécuter rapidement dans Management Studio, mais lentement dans l'application. Pour résoudre les requêtes avec Management Studio utilisez toujours le paramètre ARITHABORT du client.

Lorsque les options SET ARITHABORT et SET ANSI WARNINGS sont activées (ON), ces conditions d'erreur provoquent l'arrêt de la requête.

Lorsque l'option SET ARITHABORT est activée (ON) et l'option SET ANSI WARNINGS désactivée (OFF), ces conditions d'erreur provoquent l'arrêt du traitement. Si l'erreur se produit dans une transaction, cette dernière est annulée. Lorsque SET ARITHABORT est DÉSACTIVÉ et que l’une de ces erreurs se produit, un message d’avertissement s’affiche et le résultat de l’opération arithmétique est NULL.

Si SET ARITHABORT et SET ANSI WARNINGS sont DÉSACTIVÉs et l’une de ces erreurs se produit, un message d’avertissement s’affiche et le résultat de l’opération arithmétique est NULL.

Remarque

Si AUCUN SET ARITHABORT ni SET ARITHIGNORE n’est ACTIVÉ, SQL Server retourne NULL et un message d’avertissement s’affiche après l’exécution de la requête.

Si ANSI_WARNINGS a la valeur ON et que le niveau de compatibilité de la base de données est défini sur 90 ou une valeur supérieure, ARITHABORT est implicitement activé, quel que soit son paramètre de valeur. Si le niveau de compatibilité de base de données est défini à 80 ou moins, la valeur ON doit être affectée de manière explicite à l'option ARITHABORT.

Pour l’évaluation d’expression, si SET ARITHABORT est OFF et qu’une instruction INSERT, UPDATE ou DELETE se trouve dans une instruction arithmétique, dépassement de capacité, division par zéro ou erreur de domaine, SQL Server insère ou met à jour une NULL valeur. 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.

Lorsque la valeur de SET ARITHABORT ou de SET ARITHIGNORE est définie à OFF et que SET ANSI_WARNINGS a la valeur ON, SQL Server renvoie malgré tout un message d'erreur quand il rencontre une erreur de division par zéro ou de dépassement de capacité.

Lorsque SET ARITHABORT a la valeur OFF et qu’une erreur d’abandon se produit pendant l’évaluation de la condition booléenne d’une instruction IF, la branche FALSE s’exécute.

L'option SET ARITHABORT doit être activée (ON) lorsque vous créez ou que vous modifiez des index dans des colonnes calculées ou des vues indexées. Si SET ARITHABORT est désactivée (OFF), les instructions CREATE, UPDATE, INSERT et DELETE appliquées à des tables comportant des index sur des colonnes calculées ou des vues indexées échouent.

L'option SET ARITHABORT est appliquée lors de l'exécution, et non pas lors de l'analyse.

SET ARITHABORT OFF n’est pas pris en charge dans les pools SQL dédiés Azure Synapse Analytics.

Pour afficher la valeur actuelle de SET ARITHABORT, exécutez la requête suivante :

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

Autorisations

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

Exemples

L'exemple suivant montre des erreurs de dépassement et de division par zéro avec les paramètres 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