Condividi tramite


decimal e numeric (Transact-SQL)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsPiattaforma di strumenti analitici (PDW)Endpoint di analisi SQL in Microsoft FabricWarehouse in Microsoft Fabric

decimal e numeric sono tipi di dati numerici con precisione fissa e scala. 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. Quando viene usata la precisione massima, i valori validi provengono 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 è 0e quindi 0 <= s <= p. Le dimensioni massime di archiviazione variano a seconda della precisione.

Precisione 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.

Convertire dati decimali e numerici

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 numerico , con una precisione di 5e una scala di 3.

Conversione da Conversione in Rischio di conversione
decimal e numeric float o real Possibile perdita di precisione
int, smallint, tinyint, float, real, money o smallmoney decimal e numeric Overflow possibile

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. Viceversa, se l'opzione SET ARITHABORT è ON, SQL Server genera un errore quando si verifica l'overflow. 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 di valori float in decimal o numeric è limitata ai valori di precisione 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) arrotonda fino a 0. Questa restrizione non viene visualizzata in SQL Server 2016 (13.x) e versioni successive.

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 tramite 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