Dela via


decimal och numerisk (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

decimaler och numeriska är numeriska datatyper som har en fast precision och skala. decimaler och numeriska är synonymer och kan användas omväxlande.

Arguments

decimal [ ( p [ , s ] ) ] och numeriska [ ( p [ , s ] ) ] ]

Fasta precisions- och skalningsnummer. När maximal precision används kommer giltiga värden från till och med -10^38 + 110^38 - 1. ISO-synonymerna för decimaler är dec och dec(p,s). numeriskt är funktionellt identiskt med decimaltecken.

p (precision)

Det maximala totala antalet decimalsiffror som ska lagras. Det här talet innehåller både vänster och höger sida av decimaltecknet. Precisionen måste vara ett värde från 1 till och med den maximala precisionen på 38. Standardprecisionen är 18.

Note

Informatica stöder endast 16 signifikanta siffror, oavsett vilken precision och skala som anges.

s (scale)

Antalet decimalsiffror som lagras till höger om decimaltecknet. Det här talet subtraheras från p för att fastställa det maximala antalet siffror till vänster om decimaltecknet. Skala måste vara ett värde från 0 till p och kan endast anges om precision har angetts. Standardskalan är 0, och så 0 <= s <= p. De maximala lagringsstorlekarna varierar beroende på precisionen.

Precision Storage bytes
1 - 9 5
10-19 9
20-28 13
29-38 17

Note

Informatica (ansluten via SQL Server PDW Informatica Connector) stöder endast 16 signifikanta siffror, oavsett vilken precision och skala som anges.

Konvertera decimal- och numeriska data

För decimal- och numeriska datatyper betraktar SQL Server varje kombination av precision och skalning som en annan datatyp. Till exempel betraktas decimaler (5,5) och decimaler (5,0) som olika datatyper.

I Transact-SQL-instruktioner konverteras en konstant med en decimalpunkt automatiskt till ett numeriskt datavärde med den minsta precision och skala som krävs. Till exempel konverteras konstanten 12.345 till ett numeriskt värde med precisionen 5, och en skala på 3.

Conversion from Conversion to Conversion risk
decimal ochnumerisk flyttal eller verklig Möjlig förlust av precision
int, smallint, tinyint, float, real, money eller smallmoney decimal ochnumerisk Possible overflow

Som standard använder SQL Server avrundning när du konverterar ett tal till ett decimal - eller numeriskt värde med lägre precision och skala. Om alternativet SET ARITHABORT är ONgenererar SQL Server ett fel när spill uppstår. Förlust av endast precision och skalning räcker inte för att skapa ett fel.

Före SQL Server 2016 (13.x) begränsas konverteringen av flyttalsvärden till decimaler eller numeriska värden till endast värden med precision 17 siffror. Ett flyttalvärde som är mindre än 5E-18 (när det anges med antingen den vetenskapliga notationen 5E-18 för eller decimaltecknet för ) avrundar 0.000000000000000005ned till 0. Den här begränsningen visas inte i SQL Server 2016 (13.x) och senare versioner.

Examples

A. Skapa en tabell med hjälp av decimaldata och numeriska datatyper

I följande exempel skapas en tabell med hjälp av decimaldata och numeriska datatyper. Värden infogas i varje kolumn. Resultatet returneras med hjälp av en SELECT -instruktion.

CREATE TABLE dbo.MyTable (
    MyDecimalColumn DECIMAL(5, 2),
    MyNumericColumn NUMERIC(10, 5)
);
GO

INSERT INTO dbo.MyTable
VALUES (123, 12345.12);
GO

SELECT MyDecimalColumn, MyNumericColumn
FROM dbo.MyTable;

Här är resultatet.

MyDecimalColumn  MyNumericColumn
---------------- ----------------
123.00           12345.12000

B. Konvertera flyttal till decimal med lägre precision och skala

I följande exempel visas hur ett flyttalvärde avrundas när det konverteras till en decimal med lägre precision och skala.

CREATE TABLE dbo.MyTable (
    MyFloatColumn FLOAT,
    MyDecimalColumn DECIMAL(10, 3)
);
GO

DECLARE @value FLOAT;
SELECT @value = 12345.123456789;

INSERT INTO dbo.MyTable
VALUES (@value, @value);
GO

SELECT MyFloatColumn, MyDecimalColumn
FROM dbo.MyTable;