Dela via


Precision, skalning och längd (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-analysslutpunkt i Microsoft FabricLager i Microsoft FabricSQL-databas i Förhandsversion av Microsoft Fabric

Precision är antalet siffror i ett tal. Skala är antalet siffror till höger om decimaltecknet i ett tal. Till exempel har talet 123.45 en precision på 5 och en skala på 2.

I SQL Server är den maximala standardprecisionen för numeriska data och decimaldatatyper 38.

Längden för en numerisk datatyp är antalet byte som används för att lagra talet. För varchar och tecken är längden på en teckensträng antalet byte. För nvarchar och nchar är längden på teckensträngen antalet bytepar. Längden för datatyperna binär, varbinär och bild är antalet byte. En int-datatyp kan till exempel innehålla 10 siffror, lagras i 4 byte och accepterar inte decimaltecken. Int-datatypen har en precision på 10, en längd på 4 och en skala på 0.

  • När du sammanfogar två tecken-, varchar-, binär- eller varbinära uttryck är längden på det resulterande uttrycket summan av längden på de två källuttrycken, upp till 8 000 byte.

  • När du sammanfogar två nchar - eller nvarchar-uttryck är längden på det resulterande uttrycket summan av längden på de två källuttrycken, upp till 4 000 bytepar.

  • När du jämför två uttryck av samma datatyp men olika längder med hjälp UNIONav , EXCEPTeller INTERSECT, är den resulterande längden den längre av de två uttrycken.

Remarks

Precisionen och skalan för de numeriska datatyperna förutom decimaler är fasta. När en aritmetikoperator har två uttryck av samma typ har resultatet samma datatyp med den precision och skala som definierats för den typen. Om en operator har två uttryck med olika numeriska datatyper definierar reglerna för datatypprioritet datatypen för resultatet. Resultatet har den precision och skala som definierats för dess datatyp.

I följande tabell definieras hur resultatets precision och skala beräknas när resultatet av en åtgärd är av typen decimal. Resultatet är decimal när antingen:

  • Båda uttrycken är decimaler.
  • Ett uttryck är decimal och det andra är en datatyp med lägre prioritet än decimal.

Operanduttrycken betecknas som uttryck e1, med precision p1 och skala s1, och uttryck e2, med precision p2 och skala s2. Precisionen och skalan för alla uttryck som inte är decimaler är precisionen och skalan som definierats för uttryckets datatyp. Funktionen max(a, b) anger att du ska ta det större värdet för a eller b. min(a, b) På samma sätt anger att ta det mindre värdet för a eller b.

Operation Result precision Resultatskala 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 | UTOM | 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 Resultatprecisionen och skalan har ett absolut maxvärde på 38. När en resultatprecision är större än 38 minskas den till 38 och motsvarande skala minskas för att försöka förhindra trunkering av den integrerade delen av ett resultat. I vissa fall, till exempel multiplikation eller division, minskas inte skalningsfaktorn för att upprätthålla decimalprecision, även om spillfelet kan uppstå.

Dessutom och subtraktionsåtgärder behöver max(p1 - s1, p2 - s2) vi platser för att lagra den integrerade delen av decimaltalet. Om det inte finns tillräckligt med utrymme för att lagra dem (d.v.s max(p1 - s1, p2 - s2) < min(38, precision) - scale. ) minskas skalan för att ge tillräckligt med utrymme för den integrerade delen. Den resulterande skalan är min(precision, 38) - max(p1 - s1, p2 - s2), så deldelen kan avrundas så att den passar in i den resulterande skalan.

I multiplikations- och divisionsåtgärder behöver precision - scale vi platser för att lagra den integrerade delen av resultatet. Skalan kan minskas med hjälp av följande regler:

  1. Den resulterande skalan minskas till min(scale, 38 - (precision-scale)) om den integrerade delen är mindre än 32, eftersom den inte kan vara större än 38 - (precision-scale). Resultatet kan avrundas i det här fallet.
  2. Skalan ändras inte om den är mindre än 6 och om den integrerade delen är större än 32. I det här fallet kan ett spillfel uppstå om det inte får plats i decimaltecken(38, skala).
  3. Skalan är inställd på 6 om den är större än 6 och om integraldelen är större än 32. I det här fallet skulle både den integrerade delen och skalan minskas och den resulterande typen är decimal(38, 6). Resultatet kan avrundas till 7 decimaler, eller så utlöses spillfelet om den integrerade delen inte får plats i 32 siffror.

Examples

Följande uttryck returnerar resultat 0.00000090000000000 utan avrundning eftersom resultatet får plats i decimaltecken(38, 17):

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

I det här fallet är 61precisionen , och skalan är 40.

Den integrerade delen (precision-scale = 21) är mindre än 32, så det här fallet är det första fallet i multiplikationsreglerna och skalan beräknas som min(scale, 38 - (precision-scale)) = min(40, 38 - (61-40)) = 17. Resultattypen är decimal (38, 17).

Följande uttryck returnerar resultatet 0.000001 så att det passar in i decimaltecken(38, 6):

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

I det här fallet är 61precisionen , och skalan är 20.

Skalan är större än 6 och integraldelen (precision-scale = 41) är större än 32. Det här fallet är det tredje fallet i multiplikationsreglerna och resultattypen är decimal (38, 6).

See also