decimal и numeric (Transact-SQL)

Относится к:SQL ServerБаза данных SQL AzureУправляемый экземпляр SQL AzureAzure Synapse AnalyticsSQL аналитическая конечная точка в Microsoft FabricХранилище в Microsoft FabricSQL база данных в Microsoft Fabric

десятичные и числовые типы данных имеют фиксированную точность и масштаб. десятичные и числовые являются синонимами и могут использоваться взаимозаменяемо.

Arguments

decimal [ ( p [ , s ] и числовые [ ( p [ , s ] ] ]

Числа с фиксированной точностью и масштабом. Если используется максимальная точность, допустимые значения находятся в -10^38 + 1 диапазоне 10^38 - 1. Синонимы ISO для десятичного разряда : dec и dec(p,s). Тип numeric функционально эквивалентен типу decimal.

p (точность)

Максимальное общее число хранимых десятичных разрядов. Это число включает символы слева и справа от десятичной запятой. Точность должна быть значением в диапазоне от 1 до максимум 38. Точность по умолчанию составляет 18.

Note

В Informatica поддерживаются только 16 значащих разрядов независимо от указанных точности и масштаба.

s (гамма)

Максимальное число хранимых десятичных разрядов справа от десятичной запятой. Это число отнимается от p для определения максимального количества цифр слева от десятичной запятой. Масштаб должен иметь значение от 0 до p и может быть указан только при заданной точности. Масштаб по умолчанию — 0и поэтому 0 <= s <= p. Максимальный размер хранилища зависит от точности.

Precision Байты хранения
1–9 5
10-19 9
20-28 13
29-38 17

Note

В Informatica (при подключении с помощью соединителя SQL Server PDW для Informatica) поддерживаются только 16 значащих разрядов независимо от указанных точности и масштаба.

Преобразование десятичных и числовых данных

Для типов данных decimal и numeric SQL Server обрабатывает каждое сочетание точности и масштаба как отдельный тип данных. Например, значения decimal(5,5) и decimal(5,0) считаются разными типами данных.

В инструкциях Transact-SQL константа с десятичным разделителем автоматически преобразуется в значение типа numeric с минимальными необходимыми значениями точности и масштаба. Например, константа 12.345 преобразуется в числовое значение с точностью 5и масштабом 3.

Преобразование из Преобразование в Риск конвертации
decimal и numeric float или real Возможная потеря точности
int, smallint, tinyint, float, real, money или smallmoney decimal и numeric Возможный переполнение

По умолчанию SQL Server использует округление с потерей точности и масштаба при преобразовании числа в значение decimal или numeric. Если значение слишком велико для целевой точности, возникает ошибка арифметического переполнения (8115), когда SET ARITHABORT опцион или опцион SET ANSI_WARNINGS — ON. Когда оба варианта — OFF, результат — NULL, и SQL Server выдаёт предупреждение, если только параметр SET ARITHIGNORE не ON. Потеря только точности и масштаба не приводит к ошибке.

До SQL Server 2016 (13.x) преобразование значений с плавающей запятой в десятичное или числовое ограничено только значениями точности 17 цифр. Любое значение с плавающей запятой меньше 5E-18 (при установке с использованием научной 5E-18 нотации или десятичной нотации 0.000000000000000005) округляется до 0. Это ограничение не отображается в SQL Server 2016 (13.x) и более поздних версиях.

Examples

A. Создание таблицы с использованием десятичных и числовых типов данных

В приведенном ниже примере создается таблица, в которой используются типы данных decimal и numeric. Значения вставляются в каждый столбец. Результаты возвращаются с помощью инструкции SELECT .

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;

Вот результирующий набор.

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

B. Преобразование с плавающей запятой в десятичную с низкой точностью и масштабированием

В следующем примере показано, как значение с плавающей запятой округляется при преобразовании в десятичное значение с меньшей точностью и масштабом.

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

DECLARE @value AS FLOAT;

SELECT @value = 12345.123456789;

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

SELECT MyFloatColumn,
       MyDecimalColumn
FROM dbo.MyTable;