전체 자릿수, 소수 자릿수 및 길이(Transact-SQL)
적용 대상: Microsoft Fabric의 Microsoft Fabric SQL 데이터베이스에 있는 Microsoft Fabric Warehouse의 SQL Server Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW) SQL 분석 엔드포인트
전체 자릿수는 숫자의 자릿수입니다. 소수 자릿수는 숫자에서 소수점 오른쪽에 있는 자릿수입니다. 예를 들어 숫자 123.45
의 전체 자릿수 5
와 배율이 2
있습니다.
SQL Server에서 숫자 및 10진수 데이터 형식의 기본 최대 전체 자릿수는 38입니다.
숫자 데이터 형식의 길이는 숫자를 저장하는 데 사용되는 바이트 수입니다. varchar 및 char의 경우 문자열의 길이는 바이트 수입니다. nvarchar 및 nchar의 경우 문자열의 길이는 바이트 쌍의 수입니다. binary, varbinary 및 image 데이터 유형의 길이는 바이트 수입니다. 예를 들어 int 데이터 형식은 10자리를 보유할 수 있고 4바이트 단위로 저장되며 소수점을 허용하지 않습니다. int 데이터 형식의 전체 자릿수는 10이고 길이는 4, 소수 자릿수는 0입니다.
두 개의 char, varchar, binary 또는 varbinary 식을 연결할 때 결과 식의 길이는 최대 8,000바이트인 두 소스 식의 길이 합계입니다.
두 nchar 또는 nvarchar 식을 연결할 때 결과 식의 길이는 두 소스 식의 길이(최대 4,000바이트 쌍)의 합계입니다.
동일한 데이터 형식의 두 식을 비교하지만 길이는
UNION
EXCEPT
다르거나INTERSECT
결과 길이가 두 식보다 길어집니다.
설명
소수점 외에 숫자 데이터 형식의 전체 자릿수와 소수 자릿수가 고정됩니다. 산술 연산자에 동일한 형식의 두 식이 있는 경우 결과는 해당 형식에 대해 정의된 전체 자릿수 및 배율을 사용하여 동일한 데이터 형식을 줍니다. 다른 숫자 데이터 형식을 가진 두 식을 연산자로 결합하면 데이터 형식 우선 순위에 따라 결과의 데이터 형식이 정의됩니다. 결과에는 해당 데이터 형식에 대해 정의된 전체 자릿수와 소수 자릿수가 있습니다.
다음 표에서는 작업의 결과가 10진수 형식 일 때 결과의 전체 자릿수와 소수 자릿수를 계산하는 방법을 정의합니다. 다음 중 하나일 때 결과는 10진수입니다.
- 두 식 모두 10진수입니다.
- 한 식은 10 진수이고 다른 식은 10진수보다 우선 순위가 낮은 데이터 형식입니다.
피연산자 식은 전체 자릿수 및 소수 자릿수 p1
s1
및 식이 있는 식e2
e1
으로, 전체 자릿수 p2
와 소수 자릿수s2
로 표시됩니다. 소수점이 아닌 식의 전체 자릿수와 소수 자릿수는 식의 데이터 형식에 대해 정의된 전체 자릿수 및 소수 자릿수입니다. 함수 max(a, b)
는 더 큰 값을 a
사용하거나 b
. 마찬가지로, min(a, b)
더 작은 값을 a
사용하거나 b
.
연산 | 결과 정밀도 | 결과 배율 1 |
---|---|---|
e1 + e2 | max(s1, s2) + max(p1 - s1, p2 - s2) + 1 | max(s1, s2) |
e1 - e2 | max(s1, s2) + max(p1 - s1, p2 - s2) + 1 | max(s1, s2) |
e1 * e2 | p1 + p2 + 1 | s1 + s2 |
e1/e2 | p1 - s1 + s2 + max(6, s1 + p2 + 1) | max(6, s1 + p2 + 1) |
e1 { UNION | EXCEPT | INTERSECT } e2 | max(s1, s2) + max(p1 - s1, p2 - s2) | max(s1, s2) |
e1 % e2 | min(p1 - s1, p2 - s2) + max(s1, s2) | max(s1, s2) |
1 결과 정밀도 및 배율의 절대 최대값은 38입니다. 결과 전체 자릿수가 38보다 크면 38로 줄어들고 결과의 정수 부분을 잘리지 않도록 해당 소수 자릿수가 줄어듭니다. 곱하기 또는 나누기 등의 경우에는 오버플로 오류가 발생할 수 있지만 소수 자릿수를 유지하기 위해 배율 인수가 감소되지 않습니다.
또한 빼기 작업 외에도 소수 자릿수의 정수 부분을 저장할 위치가 필요합니다 max(p1 - s1, p2 - s2)
. 저장할 공간이 충분하지 않은 경우(즉, max(p1 - s1, p2 - s2) < min(38, precision) - scale
) 배율을 줄여 정수 부분에 충분한 공간을 제공합니다. 결과 배율이므로 min(precision, 38) - max(p1 - s1, p2 - s2)
소수 부분이 결과 눈금에 맞게 반올림될 수 있습니다.
곱하기 및 나누기 작업에서는 결과의 정수 부분을 저장할 장소가 필요합니다 precision - scale
. 다음 규칙을 사용하여 규모를 줄일 수 있습니다.
- 결과 배율은
min(scale, 38 - (precision-scale))
정수 부분이 32보다 클 수 없으므로 축소됩니다38 - (precision-scale)
. 이 경우 결과가 반올림될 수 있습니다. - 소수 자릿수가 6보다 작고 정수 부분이 32보다 큰 경우에는 크기가 변경되지 않습니다. 이 경우 10진수(38, 배율)에 맞지 않는 경우 오버플로 오류가 발생할 수 있습니다.
- 소수 자릿수가 6보다 크고 정수 부분이 32보다 큰 경우 6으로 설정됩니다. 이 경우 정수 부분과 소수 자릿수가 모두 줄어들고 결과 형식은 10진수(38, 6)입니다. 결과는 소수 자릿수 7자리로 반올림되거나 정수 부분이 32자리에 맞지 않으면 오버플로 오류가 throw됩니다.
예제
다음 식은 결과가 0.00000090000000000
10진수(38, 17)에 맞을 수 있으므로 반올림하지 않고 결과를 반환합니다.
SELECT CAST(0.0000009000 AS DECIMAL(30, 20)) * CAST(1.0000000000 AS DECIMAL(30, 20)) [decimal(38, 17)];
이 경우 전체 자릿수는 61
이며 소수 자릿수는 40
.
정수 부분은 (precision-scale = 21)
32보다 작으므로 이 경우는 곱하기 규칙의 첫 번째 사례이며 소수 자릿수는 다음과 같이 min(scale, 38 - (precision-scale)) = min(40, 38 - (61-40)) = 17
계산됩니다. 결과 형식은 10진수(38, 17)입니다.
다음 식은 decimal(38, 6)에 맞게 결과를 0.000001
반환합니다.
SELECT CAST(0.0000009000 AS DECIMAL(30, 10)) * CAST(1.0000000000 AS DECIMAL(30, 10)) [decimal(38, 6)];
이 경우 전체 자릿수는 61
이며 소수 자릿수는 20
.
소수 자릿수가 6보다 크고 정수 부분(precision-scale = 41
)이 32보다 큽니다. 이 경우는 곱하기 규칙의 세 번째 사례이며 결과 형식은 10진수(38, 6)입니다.