decimal e numeric (Transact-SQL)

Si applica a:SQL Server database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics AnalyticsPlatform System (PDW)SQL analytics endpoint in Microsoft FabricWarehouse in Microsoft Fabric

Tipi di dati numerici con precisione e scala fisse. Decimal e numeric sono sinonimi e possono essere usati in modo intercambiabile.

Argomenti

decimal[ (p[ ,s] )] e numeric[ (p[ ,s] )]
Numeri con precisione e scala fisse. Se viene utilizzata la precisione massima, i valori validi sono compresi nell'intervallo da - 10^38 +1 a 10^38 - 1. I sinonimi ISO per decimal sono dec e dec(p, s). Dal punto di vista funzionale, numeric è identico a decimal.

p (precisione)
Numero massimo totale di cifre decimali da archiviare. Include le cifre sia a destra sia a sinistra del separatore decimale. La precisione deve essere un valore compreso tra 1 e la precisione massima di 38. La precisione predefinita è 18.

Nota

Informatica supporta solo 16 cifre significative, indipendentemente dalla precisione e dalla scala specificate.

s (scala)
Numero massimo di cifre decimali che da archiviare a destra del separatore decimale. Questo numero viene sottratto da p per determinare il numero massimo di cifre a sinistra del separatore decimale. La scala deve essere un valore compreso tra 0 e p e può essere specificato solo se viene specificata la precisione. La scala predefinita è 0. Di conseguenza, 0 <= s<= p. Le dimensioni massime di archiviazione variano a seconda della precisione.

Precision Byte per l'archiviazione
1 - 9 5
10-19 9
20-28 13
29-38 17

Nota

Informatica (connesso tramite il connettore Informatica di SQL Server PDW) supporta solo 16 cifre significative, indipendentemente dalla precisione e dalla scala specificate.

Conversione dei dati di tipo decimal e numeric

Per i tipi di dati decimal e numeric, SQL Server considera ogni combinazione di precisione e scala un tipo di dati diverso. decimal(5,5) e decimal(5,0) sono ad esempio considerati tipi di dati diversi.

Nelle istruzioni Transact-SQL una costante con separatore decimale viene convertita automaticamente in un valore di tipo numeric in base ai valori di precisione e scala minimi necessari. Ad esempio, la costante 12.345 viene convertita in un valore numeric con precisione 5 e scala 3.

La conversione da decimal o numeric in float o real può determinare una perdita di precisione. La conversione da int, smallint, tinyint, float, real, money o smallmoney in decimal o numeric può determinare un overflow.

Per impostazione predefinita, quando si converte un numero in un valore decimal o numeric con precisione e scala inferiori, in SQL Server viene applicato l'arrotondamento. Se invece l'opzione SET ARITHABORT è impostata su ON, in caso di overflow SQL Server segnala un errore. La diminuzione di precisione e scala nelle operazioni di conversione non è sufficiente per generare un errore.

Prima di SQL Server 2016 (13.x), la conversione dei valori float in decimal o numeric è limitata ai soli valori con precisione a 17 cifre. Qualsiasi valore float minore di 5E-18 (se impostato usando la notazione scientifica di 5E-18 o la notazione decimale di 0,000000000000000005) viene arrotondato per difetto a 0. Questa non è più una restrizione a partire da SQL Server 2016 (13.x).

Esempi

Nell'esempio seguente viene creata una tabella usando i tipi di dati decimal e numeric. I valori vengono inseriti in ogni colonna. I risultati vengono restituiti usando un'istruzione 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;  
  

Questo è il set di risultati.

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

Vedi anche

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