Condividi tramite


decimal e numeric (Transact-SQL)

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW) Endpoint di analisi SQL in Microsoft Fabric Warehouse 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;

Il set di risultati è il seguente.

MyDecimalColumn  MyNumericColumn
---------------- ----------------
123.00           12345.12000