decimal 및 numeric(Transact-SQL)

적용 대상:SQL 서버Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMicrosoft Fabric 의 SQL 분석 엔드포인트Microsoft Fabric 의 웨어하우스Microsoft Fabric의 SQL 데이터베이스

10진 수 및 숫자는 고정된 정밀도와 배율을 갖는 숫자 데이터 형식입니다. decimal 및 numeric 은 동의어이며 서로 교환하여 사용할 수 있습니다.

Arguments

십진법 [ ( p [ , s ] ] 및 숫자 [ ( p [ , s ] ]

고정 정밀도 및 배율 숫자입니다. 최대 정밀도를 사용하는 경우 유효한 값은 을 통해 -10^38 + 1가져옵니다10^38 - 1. 10진수에 대한 ISO 동의어는 12월과 12월(p,s)입니다. 숫자는 10진수와 기능적으로 동일합니다.

p (정밀도)

저장할 최대 소수 자릿수입니다. 이 숫자에는 소수점의 왼쪽과 오른쪽이 모두 포함됩니다. 전체 자릿수 값은 1에서 최대 전체 자릿수인 38 사이여야 합니다. 기본 전체 자릿수는 18입니다.

Note

Informatica는 지정된 정밀도 및 배율에 관계없이 16개의 유효 자릿수만 지원합니다.

s (음계)

소수점 오른쪽에 저장된 소수 자릿수입니다. 이 숫자는 p에서 빼서 소수점 왼쪽의 최대 자릿수를 결정합니다. 소수 자릿수는 0에서 p까지의 값이어야 하며 전체 자릿수가 지정된 경우에만 지정할 수 있습니다. 기본 눈금은 등입니다00 <= s <= p. 전체 자릿수에 따라 최대 스토리지 크기가 달라집니다.

Precision 스토리지 바이트
9개 항목 중 5
10-19 9
20-28 13
29-38 17

Note

Informatica(SQL Server PDW Informatica Connector를 통해 연결)는 지정된 최대 자릿수 및 소수 자릿수와 상관없이 16 유효 자릿수만 지원합니다.

10진수 및 숫자 데이터 변환

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 값으로 변환할 때 반올림을 사용합니다. 값이 목표 정밀도에 비해 너무 크면, 옵션 또는 옵션이 SET ANSI_WARNINGS 가 될 ON때 SET ARITHABORT 산술 오버플로우 오류(8115)가 발생합니다. 두 옵션이 모두 이면 OFF결과는 NULL이며, SQL Server는 옵션이 아니ON면 SET ARITHIGNORE 경고를 반환합니다. 정밀도와 규모만 잃는다고 해서 오류가 발생하지 않습니다.

SQL Server 2016(13.x) 이전에는 부동 소수점 값이 소수 또는 숫자로 변환되기 전에는 전체 자릿수 17자리 값으로만 제한됩니다. 점 값은 아래로 5E-18반올림됩니다. 이 제한은 SQL Server 2016(13.x) 이상 버전에는 표시되지 않습니다.

Examples

A. 10진수 및 숫자 데이터 형식을 사용하여 테이블 만들기

다음 예제에서는 소수 및 숫자 데이터 형식을 사용하여 테이블을 만듭니다. 값은 각 열에 삽입됩니다. 결과는 문을 사용하여 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;