Udostępnij za pomocą


Precyzja, skala i długość (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punkt końcowy analizy SQL w usłudze Microsoft FabricHurtownia danych w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric

Precyzja to liczba cyfr w liczbie. Skala to liczba cyfr po prawej stronie przecinka dziesiętnego w liczbie. Na przykład liczba 123.45 ma precyzję 5 i skalę 2.

W programie SQL Server domyślna maksymalna precyzja typów danych liczbowych i dziesiętnych wynosi 38.

Długość typu danych liczbowych to liczba bajtów używanych do przechowywania liczby. W przypadku wartości varchar i char długość ciągu znaku jest liczbą bajtów. W przypadku parametrów nvarchar i nchar długość ciągu znaków jest liczbą par bajtów. Długość typów danych binarnych, varbinary i obrazów to liczba bajtów. Na przykład typ danych int może zawierać 10 cyfr, jest przechowywany w 4 bajtach i nie akceptuje punktów dziesiętnych. Typ danych int ma dokładność 10, długość 4 i skalę 0.

  • Podczas łączenia dwóch wyrażeń char, varchar, binary lub varbinary długość wyrażenia wynikowego jest sumą długości dwóch wyrażeń źródłowych, do 8000 bajtów.

  • Podczas łączenia dwóch wyrażeń nchar lub nvarchar długość wynikowego wyrażenia jest sumą długości dwóch wyrażeń źródłowych, do 4000 par bajtów.

  • Podczas porównywania dwóch wyrażeń tego samego typu danych, ale różnych długości przy użyciu wartości UNION, EXCEPTlub INTERSECT, wynikowa długość jest dłuższa od dwóch wyrażeń.

Remarks

Stała precyzja i skala typów danych liczbowych oprócz liczby dziesiętnej . Gdy operator arytmetyczny ma dwa wyrażenia tego samego typu, wynik ma ten sam typ danych z dokładnością i skalą zdefiniowaną dla tego typu. Jeśli operator ma dwa wyrażenia z różnymi typami danych liczbowych, reguły pierwszeństwa typu danych definiują typ danych wyniku. Wynik ma precyzję i skalę zdefiniowaną dla typu danych.

W poniższej tabeli opisano, jak dokładność i skala wyniku są obliczane, gdy wynik operacji jest typu dziesiętny. Wynik jest dziesiętny , gdy:

  • Oba wyrażenia są dziesiętne.
  • Jedno wyrażenie jest dziesiętne , a drugie to typ danych o niższym prioryence niż dziesiętny.

Wyrażenia operandu są oznaczone jako wyrażenie e1, z dokładnością i skalą , i wyrażeniem p1, z dokładnością s1e2 i skalą p2s2. Precyzja i skala dla dowolnego wyrażenia, które nie jest dziesiętne , to precyzja i skala zdefiniowana dla typu danych wyrażenia. Funkcja max(a, b) wskazuje, aby pobrać większą wartość a lub b. Podobnie oznacza, min(a, b) że wartość jest mniejsza a lub b.

Operation Precyzja wyników Skala wyników 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) maks(6, s1 + p2 + 1)
e1 { UNION | Z WYJĄTKIEM | 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 Precyzja i skala wyników mają bezwzględną wartość maksymalną 38. Gdy precyzja wyniku jest większa niż 38, zmniejsza się do 38, a odpowiednia skala jest zmniejszana, aby zapobiec obcinaniu całkowitej części wyniku. W niektórych przypadkach, takich jak mnożenie lub dzielenie, współczynnik skalowania nie jest zmniejszany, aby zachować precyzję dziesiętną, chociaż można zgłaszać błąd przepełnienia.

Ponadto i operacje odejmowania potrzebujemy max(p1 - s1, p2 - s2) miejsc do przechowywania całkowitej części liczby dziesiętnej. Jeśli nie ma wystarczającej ilości miejsca do ich przechowywania (czyli max(p1 - s1, p2 - s2) < min(38, precision) - scale), skala zostanie zmniejszona, aby zapewnić wystarczającą ilość miejsca dla części całkowitej. Wynikowa skala to min(precision, 38) - max(p1 - s1, p2 - s2), więc część ułamkowa może zostać zaokrąglona w celu dopasowania do wynikowej skali.

W operacjach mnożenia i dzielenia potrzebujemy precision - scale miejsc do przechowywania integralnej części wyniku. Skala może zostać zmniejszona przy użyciu następujących reguł:

  1. Wynikowa skala jest zmniejszana do min(scale, 38 - (precision-scale)) wartości , jeśli część całkowita jest mniejsza niż 32, ponieważ nie może być większa niż 38 - (precision-scale). Wynik może zostać zaokrąglony w tym przypadku.
  2. Skala nie zostanie zmieniona, jeśli jest mniejsza niż 6, a część całkowita jest większa niż 32. W takim przypadku może zostać zgłoszony błąd przepełnienia, jeśli nie może zmieścić się w przecinku (38, skala).
  3. Skala jest ustawiona na 6, jeśli jest większa niż 6, a część całkowita jest większa niż 32. W tym przypadku zarówno część całkowita, jak i skala zostaną zmniejszone, a wynikowy typ to liczba dziesiętna (38, 6). Wynik może zostać zaokrąglony do 7 miejsc dziesiętnych lub zostanie zgłoszony błąd przepełnienia, jeśli część całkowita nie może zmieścić się w 32 cyfrach.

Examples

Następujące wyrażenie zwraca wynik 0.00000090000000000 bez zaokrąglania, ponieważ wynik może mieścić się w przecinku (38, 17):

SELECT CAST(0.0000009000 AS DECIMAL(30, 20)) * CAST(1.0000000000 AS DECIMAL(30, 20)) [decimal(38, 17)];

W tym przypadku precyzja to 61, a skala to 40.

Część całkowita (precision-scale = 21) jest mniejsza niż 32, więc ten przypadek jest pierwszym przypadkiem w regułach mnożenia, a skala jest obliczana jako min(scale, 38 - (precision-scale)) = min(40, 38 - (61-40)) = 17. Typ wyniku to liczba dziesiętna (38, 17).

Następujące wyrażenie zwraca wynik 0.000001 w celu dopasowania do liczby dziesiętnej (38, 6):

SELECT CAST(0.0000009000 AS DECIMAL(30, 10)) * CAST(1.0000000000 AS DECIMAL(30, 10)) [decimal(38, 6)];

W tym przypadku precyzja to 61, a skala to 20.

Skala jest większa niż 6, a część całkowita (precision-scale = 41) jest większa niż 32. Ten przypadek jest trzecim przypadkiem w regułach mnożenia, a typ wyniku to liczba dziesiętna (38, 6).

Zobacz także