Compartilhar via


decimal e numeric (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)Ponto de extremidade de análise de SQL no Microsoft FabricDepósito 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;