decimal et numeric (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Point de terminaison analytique SQL dans Microsoft FabricEntrepôt dans Microsoft Fabric

Types de données numériques ayant une précision et une échelle fixes. Les types decimal et numeric sont synonymes et peuvent être utilisés indifféremment.

Arguments

decimal[ (p[ ,s] ) ] et numeric[ (p[ ,s] ) ]
Valeurs de précision et d'échelle fixes. Lorsque la précision maximale est utilisée, les valeurs valides sont comprises entre - 10^38 +1 et 10^38 - 1. Les synonymes ISO de decimal sont dec et dec(p, s) . numeric est fonctionnellement identique à decimal.

p (précision)
Nombre total maximal de chiffres décimaux à stocker. Ce nombre inclut le côté à gauche et le côté à droite de la virgule. La précision doit être une valeur comprise entre 1 et la précision maximale de 38. La précision par défaut est 18.

Notes

Informatica prend uniquement en charge 16 chiffres significatifs, quelles que soient la précision et l’échelle spécifiées.

s (échelle)
Nombre de chiffres décimaux stockés à droite de la virgule. Ce nombre est soustrait de p afin de déterminer le nombre maximal de chiffres à gauche de la virgule décimale. La mise à l’échelle doit être une valeur comprise entre 0 et pet peut uniquement être spécifiée si la précision est indiquée. La valeur par défaut de l’échelle est de 0, par conséquent 0 <=s<= p. Les tailles de stockage maximales varient en fonction de la précision.

Precision Taille de stockage (octets)
1-9 5
10-19 9
20-28 13
29-38 17

Notes

Informatica (connecté via le connecteur Informatica SQL Server PDW) prend uniquement en charge 16 chiffres significatifs, quelles que soient la précision et l’échelle spécifiées.

Conversion de données decimal et numeric

Pour les types de données décimal et numèrique, SQL Server considère chaque combinaison de précision et de mise à l’échelle comme un type de données différent. Par exemple, decimal(5,5) et decimal(5,0) sont considérés comme des types de données différents.

Dans les instructions Transact-SQL, une constante avec une virgule décimale est automatiquement convertie en valeur de donnée numérique, en utilisant la précision et la mise à l’échelle requises minimales. Par exemple, la constante 12,345 est convertie en valeur numeric avec une précision de 5 et une échelle de 3.

La conversion de decimal ou numeric en float ou real peut entraîner une certaine perte de précision. La conversion de int, smallint, tinyint, float, real, money ou smallmoney en decimal ou numeric peut entraîner un dépassement de capacité.

Par défaut, SQL Server utilise les arrondis lors de la conversion d’un nombre en valeur décimale ou numérique avec une précision et une mise à l’échelle plus faibles. À l’inverse, si l'option SET ARITHABORT a la valeur ON, SQL Server déclenche une erreur lors du dépassement. Perdre uniquement la précision et l'échelle ne suffit pas à engendrer une erreur.

Dans les versions antérieures à SQL Server 2016 (13.x), la conversion des valeurs float en valeurs decimal ou numeric est limitée à des valeurs d’une précision de 17 chiffres uniquement. Toutes les valeurs flottantes inférieures à 5E-18 (quand elles sont définies avec la notation scientifique 5E-18 ou la notation décimale 0,000000000000000005) sont arrondies à 0. Cette limitation n’existe plus dans SQL Server 2016 (13.x).

Exemples

L’exemple suivant crée une table à l’aide des types de données decimal et numeric. Les valeurs sont insérées dans chaque colonne. Les résultats sont retournés à l’aide d’une instruction SELECT.

CREATE TABLE dbo.MyTable  
(  
  MyDecimalColumn DECIMAL(5,2)  
,MyNumericColumn NUMERIC(10,5)
  
);  
  
GO  
INSERT INTO dbo.MyTable VALUES (123, 12345.12);  
GO  
SELECT MyDecimalColumn, MyNumericColumn  
FROM dbo.MyTable;  
  

Voici le jeu de résultats obtenu.

MyDecimalColumn                         MyNumericColumn  
--------------------------------------- ---------------------------------------  
123.00                                  12345.12000  
  
(1 row(s) affected)  
  

Voir aussi

ALTER TABLE (Transact-SQL)
CAST et CONVERT (Transact-SQL)
CREATE TABLE (Transact-SQL)
DECLARE @local_variable (Transact-SQL)
SET @local_variable (Transact-SQL)
sys.types (Transact-SQL)