Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná instance Azure SQL
Azure Synapse Analytics
Analytics Platform System (PDW)
Koncový bod analýzy SQL v Microsoft Fabric
Sklad v Microsoft Fabric
Databáze SQL v Microsoft Fabric
Přesnost je počet číslic v čísle. Měřítko je počet číslic napravo od desetinné čárky v čísle. Například číslo 123.45 má přesnost 5 a měřítko 2.
Na SQL Serveru je výchozí maximální přesnost číselných a desetinných datových typů 38.
Délka číselného datového typu je počet bajtů, které se používají k uložení čísla. Pro varchar a char je délka řetězce znaků počet bajtů. Pro nvarchar a nchar je délka znakového řetězce počet bajtů párů. Délka binárního, varbinárního a obrázkového datového typu je počet bajtů. Například datový typ int může obsahovat 10 číslic, je uložený ve 4 bajtech a nepřijímá desetinné čárky. Datový typ int má přesnost 10, délku 4 a měřítko 0.
Při zřetězení dvou znaků, varchar, binárních nebo varbinárních výrazů je délka výsledného výrazu součet délek dvou zdrojových výrazů až do 8 000 bajtů.
Když zřetědíte dva výrazy nchar nebo nvarchar , délka výsledného výrazu je součet délky dvou zdrojových výrazů až do 4 000 párů bajtů.
Při porovnání dvou výrazů stejného datového typu, ale různých délek pomocí ,
UNIONEXCEPTneboINTERSECT, je výsledná délka delší ze dvou výrazů.
Remarks
Přesnost a měřítko číselných datových typů kromě desetinných míst jsou pevné. Pokud má aritmetický operátor dva výrazy stejného typu, výsledek má stejný datový typ s přesností a měřítkem definovaným pro tento typ. Pokud má operátor dva výrazy s různými číselnými datovými typy, pravidla priorit datového typu definují datový typ výsledku. Výsledek má pro svůj datový typ definovanou přesnost a měřítko.
Následující tabulka definuje, jak se vypočítá přesnost a měřítko výsledku, když je výsledek operace typu desetinná. Výsledek je desetinný , pokud:
- Oba výrazy jsou desítkové.
- Jeden výraz je desetinný a druhý je datový typ s nižší prioritou než desítkové číslo.
Výrazy operandu jsou označeny jako výraz s přesností e1 a měřítkem p1a výrazem s1s přesností e2 a měřítkem p2.s2 Přesnost a měřítko pro libovolný výraz, který není desetinný , je přesnost a měřítko definované pro datový typ výrazu. Funkce max(a, b) označuje, že má větší hodnotu a nebo b. Podobně označuje, min(a, b) že se má menší hodnota a nebo b.
| Operation | Přesnost výsledků | Měřítko výsledků 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 | KROMĚ | 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 Přesnost a měřítko výsledků má absolutní maximum 38. Pokud je přesnost výsledku větší než 38, sníží se na 38 a odpovídající měřítko se sníží, aby se zabránilo zkrácení integrální části výsledku. V některýchpřípadechch zařízeních se v některých případech nezmenší faktor měřítka, aby se
Kromě operací odčítání potřebujeme max(p1 - s1, p2 - s2) místa k uložení celočíselné části desetinného čísla. Pokud není dostatek místa pro jejich uložení (tj max(p1 - s1, p2 - s2) < min(38, precision) - scale. ), měřítko se zmenší, aby poskytovalo dostatek místa pro integrální část. Výsledné měřítko je min(precision, 38) - max(p1 - s1, p2 - s2), takže desetinná část může být zaokrouhlená tak, aby se vešla do výsledného měřítka.
V operacích násobení a dělení potřebujeme precision - scale , aby se integrální část výsledku ukládaly. Škálování se může snížit pomocí následujících pravidel:
- Výsledné měřítko se zmenší na
min(scale, 38 - (precision-scale))to, zda je integrální část menší než 32, protože nemůže být větší než38 - (precision-scale). V tomto případě může být výsledek zaokrouhlený. - Měřítko se nezmění, pokud je menší než 6 a pokud je integrální část větší než 32. V tomto případě může dojít k chybě přetečení, pokud se nevejde do desetinné čárky (38, měřítko).
- Měřítko je nastaveno na 6, pokud je větší než 6 a pokud je integrální část větší než 32. V tomto případě by se integrální část i měřítko snížily a výsledný typ byl desetinný(38; 6). Výsledek může být zaokrouhlen na 7 desetinných míst nebo pokud se integrální část nevejde do 32 číslic, vyvolá se chyba přetečení.
Examples
Následující výraz vrátí výsledek 0.00000090000000000 bez zaokrouhlení, protože výsledek se může vejít do desetinných míst(38, 17):
SELECT CAST(0.0000009000 AS DECIMAL(30, 20)) * CAST(1.0000000000 AS DECIMAL(30, 20)) [decimal(38, 17)];
V tomto případě je 61přesnost a měřítko je 40.
Integrální část (precision-scale = 21) je menší než 32, takže tento případ je prvním případem v pravidlech násobení a měřítko se vypočítá jako min(scale, 38 - (precision-scale)) = min(40, 38 - (61-40)) = 17. Typ výsledku je desetinný(38; 17).
Následující výraz vrátí výsledek
SELECT CAST(0.0000009000 AS DECIMAL(30, 10)) * CAST(1.0000000000 AS DECIMAL(30, 10)) [decimal(38, 6)];
V tomto případě je 61přesnost a měřítko je 20.
Měřítko je větší než 6 a integrální část (precision-scale = 41) je větší než 32. Tento případ je třetím případem v pravidlech násobení a typ výsledku je desetinný(38; 6).