decimais e numéricos (Transact-SQL)

Aplica-se a:SQL ServerBase de Dados SQL do AzureAzure SQL Managed InstanceAzure Synapse AnalyticsEndpoint de análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de dados SQL no Microsoft Fabric

decimal e numérico são tipos de dados numéricos que têm uma precisão e escala fixas. decimal e numérico são sinónimos e podem ser usados indistintamente.

Arguments

decimal [ ( p [ , s ] ] ] e numérico [ ( p [ , s ] ) ]

Precisão fixa e números de escala. Quando a precisão máxima é usada, os valores válidos são de -10^38 + 1 até .10^38 - 1 Os sinónimos ISO para decimal são dec e dec(p,s). numérico é funcionalmente idêntico ao decimal.

p (precisão)

O número total máximo de dígitos decimais a serem armazenados. Este número inclui os lados esquerdo e direito da vírgula decimal. A precisão deve ser um valor de 1 até à precisão máxima de 38. A precisão padrão é 18.

Note

A Informatica suporta apenas 16 dígitos significativos, independentemente da precisão e escala especificadas.

s (escala)

O número de dígitos decimais armazenados à direita da vírgula decimal. Este número é subtraído de p para determinar o número máximo de dígitos à esquerda da vírgula decimal. A escala deve ser um valor de 0 a p e só pode ser especificada se a precisão for especificada. A escala padrão é 0, e assim 0 <= s <= p. Os tamanhos máximos de armazenamento variam, com base na precisão.

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

Note

A Informatica (conectada por meio do SQL Server PDW Informatica Connector) suporta apenas 16 dígitos significativos, independentemente da precisão e da escala especificadas.

Converter dados decimais e numéricos

Para tipos de dados decimais e numéricos , o SQL Server considera cada combinação de precisão e escala como um tipo de dados diferente. Por exemplo, decimal(5,5) e decimal(5,0) são considerados tipos de dados diferentes.

Em instruções Transact-SQL, uma constante com um ponto decimal é automaticamente convertida em um valor de dados numéricos , usando a precisão mínima e a escala necessárias. Por exemplo, a constante 12.345 é convertida em um valor numérico , com uma precisão de 5, e uma escala de 3.

Conversão de Conversão para Risco de conversão
decimal e numérico flutuar ou real Possível perda de precisão
int, smallint, tinyint, float, real, dinheiro ou smallmoney decimal e numérico Possível transbordo

Por padrão, o SQL Server usa arredondamento ao converter um número em um valor decimal ou numérico com menor precisão e escala. Por outro lado, se a opção for SET ARITHABORT, o ON SQL Server gerará um erro quando ocorrer estouro. A perda apenas de precisão e escala não é suficiente para gerar um erro.

Antes do SQL Server 2016 (13.x), a conversão de valores flutuantes em decimais ou numéricos era restrita apenas a valores de precisão de 17 dígitos. Qualquer valor flutuante inferior 5E-18 a (quando definido usando a notação científica de 5E-18 ou a notação decimal de 0.000000000000000005) arredonda para baixo para 0. Essa restrição não aparece no SQL Server 2016 (13.x) e versões posteriores.

Examples

A. Criar uma tabela usando tipos de dados decimais e numéricos

O exemplo a seguir cria uma tabela usando os tipos de dados decimal e numérico . Os valores são inseridos em cada coluna. Os resultados são retornados usando uma SELECT instrução.

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;

Aqui está o conjunto de resultados.

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

B. Converta float em decimal com menor precisão e escala

O exemplo a seguir mostra como um valor float é arredondado quando convertido em decimal com menor precisão e escala.

CREATE TABLE dbo.MyTable (
    MyFloatColumn FLOAT,
    MyDecimalColumn DECIMAL(10, 3)
);
GO

DECLARE @value FLOAT;
SELECT @value = 12345.123456789;

INSERT INTO dbo.MyTable
VALUES (@value, @value);
GO

SELECT MyFloatColumn, MyDecimalColumn
FROM dbo.MyTable;