Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à :SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Point de terminaison d’analytique SQL dans Microsoft Fabric
Entrepôt dans Microsoft Fabric
Base 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 ONetSET 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 ARITHABORTet qu’une erreur arithmétique se produit, un message d’avertissement apparaît (sauf siSET ARITHIGNOREestON) et le résultat de l’opération arithmétique estNULL.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.
- Le script crée des tables
t1d’exemple ett2insère des valeurs de données d’exemple. - Configurez
ANSI_WARNINGS ONet 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. - On règle
ANSI_WARNINGS OFFpour que aitARITHABORTun effet, et on metARITHABORT ON. Effectuez des tests pour voir le comportement avec une erreur de division par zéro et un débordement arithmétique. - Posez à la fois
ANSI_WARNINGS OFFetARITHABORT OFF. Effectuez des tests pour voir le comportement avec une erreur de division par zéro et un débordement arithmétique. - 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