Partager via


SET ARITHABORT (Transact-SQL)

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

Icône Lien de rubrique Conventions de la syntaxe Transact-SQL

Syntaxe

SET ARITHABORT { ON | OFF }
[ ; ]

Notes

ARITHABORT doit toujours avoir la valeur ON dans vos sessions de connexion. Le paramètre ARITHABORT OFF peut avoir un impact négatif sur l'optimisation des requêtes et entraîner des problèmes de performances.

AttentionAttention

Le paramètre ARITHABORT par défaut pour SQL Server Management Studio est 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.

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

Si 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. Si SET ARITHABORT est défini à OFF et que l'une de ces erreurs se produit, un message d'avertissement s'affiche, et la valeur NULL est attribuée au résultat de l'opération arithmétique.

Si SET ARITHABORT et SET ANSI WARNINGS sont définis sur OFF et que l'une de ces erreurs se produit, un message d'avertissement s'affiche, et la valeur NULL est attribuée au résultat de l'opération arithmétique.

[!REMARQUE]

Si ni SET ARITHABORT ni SET ARITHIGNORE ne sont définies, SQL Server renvoie la valeur NULL avec un message d'avertissement après l'exécution de la requête.

L'affectation de la valeur ON à ANSI_WARNINGS affecte de manière implicite la valeur ON à ARITHABORT, lorsque le niveau de compatibilité de la base de données est d'au moins 90. 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.

Si, au cours de l'évaluation de l'expression, une instruction INSERT, DELETE ou UPDATE rencontre une erreur arithmétique, un dépassement de capacité, une division par zéro ou une erreur de domaine alors que l'option SET ARITHABORT est définie à OFF, SQL Server insère ou met à jour une valeur NULL. Si la colonne cible ne peut pas prendre la valeur Null, l'action d'insertion ou de mise à jour échoue et l'utilisateur reçoit une erreur.

Si SET ARITHABORT ou SET ARITHIGNORE a la valeur OFF et que SET ANSI_WARNINGS a la valeur ON, SQL Server retourne néanmoins un message d'erreur lorsqu'il rencontre une erreur de division par zéro ou de dépassement de capacité.

Si la valeur de SET ARITHABORT est définie à OFF et qu'une erreur d'abandon se produit durant l'évaluation de la condition booléenne d'une instruction IF, la branche FALSE est exécutée.

L'option SET ARITHABORT doit être activée (valeur 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.

Autorisations

Il est indispensable d'être membre du rôle public.

Exemples

L'exemple suivant montre des erreurs de dépassement et de division par zéro, avec l'option SET ARITHABORT tour à tour activée et désactivée.

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

Voir aussi

Référence

Instructions SET (Transact-SQL)

SET ARITHIGNORE (Transact-SQL)

SESSIONPROPERTY (Transact-SQL)