SET NUMERIC_ROUNDABORT (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

Spécifie le niveau de gravité de l'erreur générée lorsqu'un arrondi effectué dans une expression entraîne une perte de précision.

Conventions de la syntaxe Transact-SQL

Syntaxe


SET NUMERIC_ROUNDABORT { ON | OFF }

Notes

Si l'option SET NUMERIC_ROUNDABORT est définie à ON (activée), une erreur se produit dès qu'une perte de précision survient dans une expression. Si la valeur est OFF, les pertes de précision ne génèrent pas de messages d'erreur. Le résultat est arrondi en fonction de la précision définie pour la colonne ou la variable contenant le résultat.

Une perte de précision se produit quand vous essayez de stocker une valeur avec une précision fixe dans une colonne ou une variable dont la précision est moindre.

Si SET NUMERIC_ROUNDABORT est défini à ON, SET ARITHABORT détermine la gravité de l'erreur générée. Le tableau suivant montre les effets de cette valeur (activée et désactivée), dans le cas d'une perte de précision.

Paramètre SET NUMERIC_ROUNDABORT ON SET NUMERIC_ROUNDABORT OFF
SET ARITHABORT ON Une erreur est générée ; aucun ensemble de résultats n’est retourné. Pas d'erreur ou d'avertissement ; le résultat est arrondi.
SET ARITHABORT OFF Un avertissement est renvoyé ; l'expression renvoie la valeur NULL. Pas d'erreur ou d'avertissement ; le résultat est arrondi.

L'option SET NUMERIC_ROUNDABORT est définie lors de l'exécution, et non pas au moment de l'analyse.

SET NUMERIC_ROUNDABORT doit être désactivée (valeur OFF) quand vous créez ou modifiez des index sur des colonnes calculées ou des vues indexées. Si l’option SET NUMERIC_ROUNDABORT est activée (ON), les instructions suivantes exécutées dans des tables comportant des index sur des colonnes calculées ou des vues indexées échouent :

  • CREATE
  • UPDATE
  • INSERT
  • Suppression

Pour plus d’informations sur les paramètres d’option SET requis dans des vues indexées et des index sur des colonnes calculées, consultez Remarques sur l’utilisation des instructions SET.

Pour afficher la valeur actuelle de ce paramètre, exécutez la requête suivante :

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

Autorisations

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

Exemples

L’exemple suivant montre deux valeurs avec une précision à quatre décimales. Ces valeurs sont ajoutées et stockées dans une variable ayant une précision à deux décimales. Les expressions montrent les effets des différents paramètres SET NUMERIC_ROUNDABORT et SET ARITHABORT.

-- SET NOCOUNT to ON,   
-- SET NUMERIC_ROUNDABORT to ON, and SET ARITHABORT to ON.  
SET NOCOUNT ON;  
PRINT 'SET NUMERIC_ROUNDABORT ON';  
PRINT 'SET ARITHABORT ON';  
SET NUMERIC_ROUNDABORT ON;  
SET ARITHABORT ON;  
GO  
DECLARE @result DECIMAL(5, 2),  
   @value_1 DECIMAL(5, 4),   
   @value_2 DECIMAL(5, 4);  
SET @value_1 = 1.1234;  
SET @value_2 = 1.1234 ;  
SELECT @result = @value_1 + @value_2;  
SELECT @result;  
GO  
  
-- SET NUMERIC_ROUNDABORT to ON and SET ARITHABORT to OFF.  
PRINT 'SET NUMERIC_ROUNDABORT ON';  
PRINT 'SET ARITHABORT OFF';  
SET NUMERIC_ROUNDABORT ON;  
SET ARITHABORT OFF;  
GO  
DECLARE @result DECIMAL(5, 2),  
   @value_1 DECIMAL(5, 4),   
   @value_2 DECIMAL(5, 4);  
SET @value_1 = 1.1234;  
SET @value_2 = 1.1234 ;  
SELECT @result = @value_1 + @value_2;  
SELECT @result;  
GO  
  
-- SET NUMERIC_ROUNDABORT to OFF and SET ARITHABORT to ON.  
PRINT 'SET NUMERIC_ROUNDABORT OFF';  
PRINT 'SET ARITHABORT ON';  
SET NUMERIC_ROUNDABORT OFF;  
SET ARITHABORT ON;  
GO  
DECLARE @result DECIMAL(5, 2),  
   @value_1 DECIMAL(5, 4),   
   @value_2 DECIMAL(5, 4);  
SET @value_1 = 1.1234;  
SET @value_2 = 1.1234 ;  
SELECT @result = @value_1 + @value_2;  
SELECT @result;  
GO  
  
-- SET NUMERIC_ROUNDABORT to OFF and SET ARITHABORT to OFF.  
PRINT 'SET NUMERIC_ROUNDABORT OFF';  
PRINT 'SET ARITHABORT OFF';  
SET NUMERIC_ROUNDABORT OFF;  
SET ARITHABORT OFF;  
GO  
DECLARE @result DECIMAL(5, 2),  
   @value_1 DECIMAL(5, 4),   
   @value_2 DECIMAL(5, 4);  
SET @value_1 = 1.1234;  
SET @value_2 = 1.1234;  
SELECT @result = @value_1 + @value_2;  
SELECT @result;  
GO  

Voir aussi

Types de données (Transact-SQL)
Instructions SET (Transact-SQL)
SET ARITHABORT (Transact-SQL)