decimal y numeric (Transact-SQL)

Se aplica a: síSQL Server (todas las versiones admitidas) SíAzure SQL Database SíInstancia administrada de Azure SQL síAzure Synapse Analytics síAlmacenamiento de datos paralelos

Tipos de datos numéricos que tienen precisión y escala fijas. Los tipos decimal y numeric son sinónimos y se pueden usar indistintamente.

Argumentos

decimal[ ( p[ , s] ) ] y numeric[ ( p[ , s] ) ]
Números de precisión y escala fijas. Cuando se utiliza la precisión máxima, los valores válidos se sitúan entre - 10^38 +1 y 10^38 - 1. Los sinónimos ISO para decimal son dec y dec( p, s ) . numeric es funcionalmente idéntico a decimal.

p (precisión)
El número total máximo de dígitos decimales que se almacenarán. Este número incluye los lados derecho e izquierdo del separador decimal. La precisión debe ser un valor comprendido entre 1 y la precisión máxima de 38. La precisión predeterminada es 18.

Nota

Informatica solo admite 16 dígitos significativos, sin tener en cuenta la precisión y la escala especificada.

s (escala)
El número de dígitos decimales que se almacenarán a la derecha del separador decimal. Este número se extrae de p para determinar el número máximo de dígitos a la izquierda del separador decimal. La escala debe ser un valor comprendido entre 0 y p, y solo se puede especificar si se especifica la precisión. La escala predeterminada es 0, por lo que 0 < = s <= p. Los tamaños de almacenamiento máximo varían según la precisión.

Precision Bytes de almacenamiento
1 - 9 5
10-19 9
20-28 13
29-38 17

Nota

Informatica (conectado a través del conector PDW de SQL Server de Informatica) solo admite 16 dígitos significativos, sin tener en cuenta la precisión y la escala especificada.

Convertir datos decimal y numeric

En el caso de los tipos de datos decimal y numeric, SQL Server considera cada combinación de precisión y escala como un tipo de datos distinto. Por ejemplo, decimal(5,5) y decimal(5,0) se consideran tipos de datos diferentes.

En las instrucciones Transact-SQL, una constante con un separador decimal se convierte automáticamente a un valor de datos numeric, con la precisión y escala mínimas necesarias. Por ejemplo, la constante 12.345 se convierte a un valor numeric con una precisión de 5 y una escala de 3.

Al convertir de decimal o numeric a float o real se puede provocar una pérdida de precisión. Al convertir de int, smallint, tinyint, float, real, money o smallmoney a decimal o numeric se puede provocar un desbordamiento.

De forma predeterminada, SQL Server usa el redondeo cuando convierte un número a un valor decimal o numeric con una precisión y una escala inferiores. Y a la inversa, si la opción SET ARITHABORT está establecida en ON, SQL Server genera un error cuando se produce un desbordamiento. La pérdida de únicamente precisión y escala no es suficiente para generar un error.

Antes de SQL Server 2016 (13.x), la conversión de los valores float a decimal o numeric se restringía únicamente a los valores con una precisión de 17 dígitos. Cualquier valor float menor de 5E-18 (cuando se establece mediante la notación científica de 5E-18 o la notación decimal de 0,0000000000000000050000000000000005) se redondea hacia abajo a 0. A partir de SQL Server 2016 (13.x) esto ya no es una restricción.

Ejemplos

En este ejemplo se crea una tabla con los tipos de datos decimal y numeric. Los valores se insertan en cada columna. Los resultados se devuelven mediante una instrucción 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;  
  

El conjunto de resultados es el siguiente:

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

Consulte también

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