decimal y numeric (Transact-SQL)
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Punto de conexión de análisis SQL en Microsoft Fabric Almacenamiento en Microsoft Fabric
decimales y numéricos son tipos de datos numéricos que tienen una precisión y escala fijas. 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 usa la precisión máxima, los valores válidos son de a través 10^38 - 1
de -10^38 + 1
. Los sinónimos ISO para decimales 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
y, por tanto 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.
Conversión de datos decimales y numéricos
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 en un valor numérico , con una precisión de 5
y una escala de 3
.
Conversión de | Conversión a | Riesgo de conversión |
---|---|---|
decimal y numeric | float o real | Posible pérdida de precisión |
int, smallint, tinyint, float, real, money o smallmoney | decimal y numeric | Posible 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. Por el contrario, si la SET ARITHABORT
opción es 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 valores float a decimal o numeric solo está restringida a valores de precisión de 17 dígitos. Cualquier valor float menor que 5E-18
(cuando se establece mediante la notación científica de 5E-18
o la notación decimal de 0.000000000000000005
) redondea hacia abajo a 0
. Esta restricción no aparece en SQL Server 2016 (13.x) ni en versiones posteriores.
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 SELECT
instrucción .
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;
Este es el conjunto de resultados.
MyDecimalColumn MyNumericColumn
---------------- ----------------
123.00 12345.12000