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 Warehouse en Microsoft Fabric Base de datos SQL de 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