Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL Analytics-eindpunt in Microsoft Fabric
Magazijn in Microsoft Fabric
SQL-database in Microsoft Fabric Preview
Precisie is het aantal cijfers in een getal. Schaal is het aantal cijfers rechts van het decimaalteken in een getal. Het getal 123.45 heeft bijvoorbeeld een precisie van 5 en een schaal van 2.
In SQL Server is de standaard maximale precisie van numerieke en decimale gegevenstypen 38.
De lengte voor een numeriek gegevenstype is het aantal bytes dat wordt gebruikt om het getal op te slaan. Voor varchar en char is de lengte van een tekenreeks het aantal bytes. Voor nvarchar en nchar is de lengte van de tekenreeks het aantal byteparen. De lengte voor binaire, varbinaire en afbeeldingsgegevenstypen is het aantal bytes. Een gegevenstype int kan bijvoorbeeld 10 cijfers bevatten, wordt opgeslagen in 4 bytes en accepteert geen decimalen. Het gegevenstype int heeft een precisie van 10, een lengte van 4 en een schaal van 0.
Wanneer u twee tekens, varchar, binaire of varbinaire expressies samenvoegt, is de lengte van de resulterende expressie de som van de lengte van de twee bronexpressies, maximaal 8000 bytes.
Wanneer u twee nchar- of nvarchar-expressies samenvoegt, is de lengte van de resulterende expressie de som van de lengte van de twee bronexpressies, maximaal 4000 byteparen.
Wanneer u twee expressies van hetzelfde gegevenstype vergelijkt, maar verschillende lengten gebruikt,
UNIONEXCEPTofINTERSECT, is de resulterende lengte de langere van de twee expressies.
Remarks
De precisie en schaal van de numerieke gegevenstypen naast decimalen zijn vast. Wanneer een rekenkundige operator twee expressies van hetzelfde type heeft, heeft het resultaat hetzelfde gegevenstype met de precisie en schaal die voor dat type is gedefinieerd. Als een operator twee expressies met verschillende numerieke gegevenstypen heeft, definiƫren de regels van de prioriteit van het gegevenstype het gegevenstype van het resultaat. Het resultaat heeft de precisie en schaal gedefinieerd voor het gegevenstype.
In de volgende tabel wordt gedefinieerd hoe de precisie en schaal van het resultaat worden berekend wanneer het resultaat van een bewerking van het type decimaal is. Het resultaat is decimaal wanneer:
- Beide expressies zijn decimaal.
- De ene expressie is decimaal en de andere is een gegevenstype met een lagere prioriteit dan decimaal.
De operand-expressies worden aangeduid als expressie e1, met precisie p1 en schaal s1en expressie e2, met precisie p2 en schaal s2. De precisie en schaal voor elke expressie die niet decimaal is, is de precisie en schaal die is gedefinieerd voor het gegevenstype van de expressie. De functie max(a, b) geeft aan dat de hogere waarde van a of b. Geeft ook min(a, b) aan dat de kleinere waarde van a of b.
| Operation | Result precision | Resultaatschaal 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 | BEHALVE | 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 De resultaatprecisie en -schaal hebben een absoluut maximum van 38. Wanneer een resultaatprecisie groter is dan 38, wordt deze verkleind tot 38 en wordt de bijbehorende schaal verkleind om te voorkomen dat het integraal deel van een resultaat wordt afgekapt. In sommige gevallen, zoals vermenigvuldigen of delen, wordt de schaalfactor niet verminderd om decimaal precisie te behouden, hoewel de overloopfout kan worden gegenereerd.
Daarnaast en aftrekkingsbewerkingen hebben we plaatsen nodig max(p1 - s1, p2 - s2) om het integraal deel van het decimale getal op te slaan. Als er onvoldoende ruimte is om ze op te slaan (dat wil max(p1 - s1, p2 - s2) < min(38, precision) - scalegezegd), wordt de schaal verkleind om voldoende ruimte te bieden voor het integraal onderdeel. De resulterende schaal is min(precision, 38) - max(p1 - s1, p2 - s2), zodat het breukdeel kan worden afgerond om in de resulterende schaal te passen.
Bij vermenigvuldigings- en delingsbewerkingen hebben we plaatsen nodig precision - scale om het integraal deel van het resultaat op te slaan. De schaal kan worden verkleind met behulp van de volgende regels:
- De resulterende schaal wordt verkleind tot
min(scale, 38 - (precision-scale))als het integraal onderdeel kleiner is dan 32, omdat het niet groter kan zijn dan38 - (precision-scale). Het resultaat kan in dit geval worden afgerond. - De schaal wordt niet gewijzigd als deze kleiner is dan 6 en als het integraal onderdeel groter is dan 32. In dit geval kan er een overloopfout optreden als deze niet in decimale (38, schaal) past.
- De schaal is ingesteld op 6 als deze groter is dan 6 en als het integraal onderdeel groter is dan 32. In dit geval zouden zowel het integrale deel als de schaal worden verminderd en is het resulterende type decimaal(38, 6). Het resultaat kan worden afgerond op 7 decimalen of de overloopfout wordt gegenereerd als het integraal onderdeel niet in 32 cijfers past.
Examples
De volgende expressie retourneert resultaat 0.00000090000000000 zonder afronding, omdat het resultaat in decimalen kan passen(38, 17):
SELECT CAST(0.0000009000 AS DECIMAL(30, 20)) * CAST(1.0000000000 AS DECIMAL(30, 20)) [decimal(38, 17)];
In dit geval is 61precisie , en schaal is 40.
Het integraal onderdeel (precision-scale = 21) is kleiner dan 32, dus dit is het eerste geval in de vermenigvuldigingsregels en de schaal wordt berekend als min(scale, 38 - (precision-scale)) = min(40, 38 - (61-40)) = 17. Resultaattype is decimaal(38, 17).
De volgende expressie retourneert het resultaat 0.000001 dat in decimalen (38, 6) past:
SELECT CAST(0.0000009000 AS DECIMAL(30, 10)) * CAST(1.0000000000 AS DECIMAL(30, 10)) [decimal(38, 6)];
In dit geval is 61precisie , en schaal is 20.
Schaal is groter dan 6 en het integraal deel (precision-scale = 41) is groter dan 32. Dit is het derde geval in de vermenigvuldigingsregels en het resultaattype is decimaal(38, 6).