Share via


decimal y numeric (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punto de conexión de análisis SQL en Microsoft FabricAlmacenamiento 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 - 1de -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 0y, 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 5y 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;

El conjunto de resultados es el siguiente:

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