decimal e numeric (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsEndpoint de análise SQL no Microsoft FabricArmazém no Microsoft FabricBanco de dados SQL no Microsoft Fabric

Decimal e numérico são tipos de dados numéricos que têm precisão e escala fixas. decimal e numérico são sinônimos e podem ser usados de forma intercambiável.

Arguments

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

Números de precisão e escala fixos. 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). numeric é funcionalmente equivalente a decimal.

p (precisão)

O número total máximo de dígitos decimais a ser armazenados. Esse número inclui o que está à direita e à esquerda do ponto decimal. A precisão deve ser um valor de 1 até a precisão máxima de 38. A precisão padrão é 18.

Note

Informatica é compatível apenas com 16 dígitos significativos, independentemente da precisão e da escala especificadas.

s (escala)

O número máximo de dígitos decimais que são armazenados à direita do ponto decimal. Esse número é subtraído de p para determinar o número máximo de dígitos à esquerda do separador decimal. A escala deve ser um valor de 0 a p, e só poderá ser especificada se a precisão for definida. 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

Informatica (conectado por meio do conector do SQL Server PDW Informatica) é compatível apenas com 16 dígitos significativos, independentemente da precisão e da escala especificadas.

Converter dados decimais e numéricos

Para os tipos de dados decimal e numeric, 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.

Nas instruções do Transact-SQL, uma constante com um ponto decimal é convertida automaticamente em um valor de dados numeric, usando a escala e a precisão mínimas 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 numeric flutuador ou real Possível perda de precisão
int, smallint, tinyint, float, real, money ou smallmoney decimal e numeric Possível transbordo

Por padrão, o SQL Server usa arredondamento ao converter um número em um valor decimal ou numeric com precisão e escala inferiores. Por outro lado, se a opção for SET ARITHABORT, o ON SQL Server gerará um erro quando ocorrer estouro. Apenas a perda 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 é restrita apenas a valores de precisão de 17 dígitos. Qualquer valor flutuante 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 numéricos e decimais

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;

Veja a seguir o conjunto de resultados.

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

B. Converter float em decimal com uma precisão e escala mais baixas

O exemplo a seguir mostra como um valor flutuante é arredondado quando convertido em um decimal com uma precisão e escala mais baixas.

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;