Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Punkt końcowy analizy SQL w usłudze Microsoft Fabric
Hurtownia danych w usłudze Microsoft Fabric
Baza 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,EXCEPTlubINTERSECT, 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ł:
- 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. - 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).
- 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).