Megosztás a következőn keresztül:


decimális és numerikus (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példányAzure Synapse AnalyticsElemzési platformrendszer (PDW)SQL Analytics-végpont a Microsoft FabricbenRaktár a Microsoft FabricbenSQL-adatbázis a Microsoft Fabricben

a decimális és numerikus adattípusok rögzített pontosságú és skálázású numerikus adattípusok. a decimális és a numerikus szinonimák, és felcserélhetőek.

Arguments

decimális [ ( p [ , s ] ) ] és numerikus [ ( p [ , s ] ) ]

Rögzített pontosság és skálázási számok. A maximális pontosság használata esetén az érvényes értékek a következőkből -10^38 + 1származnak10^38 - 1: . A dec és dec(p;s) iso szinonimái dec és dec(p). a numerikus függvény funkcionálisan megegyezik a tizedes törtel.

p (precízió)

A tárolható tizedesjegyek maximális teljes száma. Ez a szám a tizedesvessző bal és jobb oldalát is tartalmazza. A pontosságnak 1 és 38 közötti maximális pontosságúnak kell lennie. Az alapértelmezett pontosság 18.

Note

Az Informatica a megadott pontosságtól és mérettől függetlenül csak 16 jelentős számjegyet támogat.

s (skálák)

A tizedesvessző jobb oldalán tárolt tizedesjegyek száma. Ez a szám a tizedesvesszőtől balra lévő számjegyek maximális számának meghatározásához p-ből lesz kivonva. A skálázásnak 0 és p közötti értéknek kell lennie, és csak pontosság megadása esetén adható meg. Az alapértelmezett skálázás így van00 <= s <= p. A maximális tárolási méretek a pontosságtól függően eltérőek lehetnek.

Precision Tárolási bájtok
1 - 9 5
10-19 9
20-28 13
29-38 17

Note

Az Informatica (az SQL Server PDW Informatica-összekötőn keresztül csatlakozva) csak 16 jelentős számjegyet támogat a megadott pontosságtól és mérettől függetlenül.

Decimális és numerikus adatok konvertálása

Decimális és numerikus adattípusok esetén az SQL Server a pontosság és a skálázás minden kombinációját eltérő adattípusnak tekinti. Például a decimális(5,5) és a decimális(5,0) különböző adattípusnak számít.

Az Transact-SQL utasításokban a decimális ponttal rendelkező állandók automatikusan numerikus adatértékké alakulnak a szükséges minimális pontosság és skálázás használatával. Az állandót 12.345 például numerikus értékké alakítja a rendszer, amelynek pontossága 5és skálája .3

Átváltás Átalakítás Konverziós kockázat
decimális és numerikus lebegőpontos vagy valós A pontosság lehetséges elvesztése
int, smallint, tinyint, float, real, money vagy smallmoney decimális és numerikus Lehetséges túlcsordulás

Az SQL Server alapértelmezés szerint kerekítést használ a szám decimális vagy numerikus értékké alakításakor, kisebb pontossággal és skálázással. Ezzel szemben, ha a beállítás az, az SET ARITHABORTONSQL Server hibát jelez túlcsordulás esetén. A csak pontosság és skálázás elvesztése nem elegendő a hiba létrehozásához.

Az SQL Server 2016 (13.x) előtt a lebegőpontos értékek decimális vagy numerikus értékké alakítása csak 17 számjegy pontosságú értékekre korlátozódik. Minden olyan lebegőpontos érték, amely kisebb , mint 5E-18 (ha a tudományos jelölés 5E-18 vagy a tizedesjegyzet 0.000000000000000005használatával van beállítva) lefelé 0kerekül. Ez a korlátozás nem jelenik meg az SQL Server 2016 (13.x) és újabb verzióiban.

Examples

A. Táblázat létrehozása decimális és numerikus adattípusokkal

Az alábbi példa egy táblázatot hoz létre a decimális és numerikus adattípusok használatával. A rendszer minden oszlopba beszúr értékeket. Az eredmények egy utasítással SELECT lesznek visszaadva.

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;

Itt van az eredmények összessége.

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

B. Az úszót decimálissá alakíthatja kisebb pontossággal és skálázással

Az alábbi példa bemutatja, hogyan lesz kerekítve egy lebegőpontos érték, ha kisebb pontosságú és skálázású decimálisra van konvertálva.

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;