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.
Syntaxe
SET ARITHABORT { ON | OFF }
[ ; ]
Notes
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.
[!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éfini à 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 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é.
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. Pour plus d'informations sur les valeurs requises des options SET dans des vues indexées et index de colonnes calculées, consultez Options SET affectant les résultats.
L'option SET ARITHABORT est appliquée lors de l'exécution, et non pas lors de l'analyse.
Autorisations
Nécessite l'appartenance au rôle public.
Exemple
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