Partilhar via


decimais e numéricos (Transact-SQL)

Aplica-se a:SQL ServerBase de Dados SQL do AzureInstância Gerida do Azure SQLAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Ponto de Extremidade 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;