decimal und numeric (Transact-SQL)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL-Analyseendpunkt in Microsoft Fabric Warehouse in Microsoft Fabric SQL-Datenbank in Microsoft Fabric
Dezimal - und numerisch sind numerische Datentypen mit fester Genauigkeit und Skalierung. Dezimal und numerisch sind Synonyme und können austauschbar verwendet werden.
Argumente
Dezimalzahl [ ( p [ , s ] ) ] und numerische [ ( p [ , s ] ) ]
Zahlen mit fester Genauigkeit und mit fester Anzahl von Dezimalstellen. Wenn die maximale Genauigkeit verwendet wird, sind gültige Werte von -10^38 + 1
bis zu 10^38 - 1
. Die ISO-Synonyme für Dezimalstellen sind dezimal und dez(p;s). Die Funktion von numeric ist mit der von decimal identisch.
p (Genauigkeit)
Die maximale Gesamtanzahl der zu speichernden Dezimalstellen. Diese Zahl schließt die Ziffern links und rechts des Dezimaltrennzeichens ein. Die Genauigkeit muss ein Wert zwischen 1 und der maximalen Genauigkeit von 38 sein. Die Standardgenauigkeit beträgt 18.
Hinweis
Informatica unterstützt unabhängig von der angegebenen Präzision und dem Dezimalstellenwert nur 16 signifikante Ziffern.
s (Dezimalstellenwert)
Die Anzahl von Dezimalstellen die rechts vom Dezimaltrennzeichen gespeichert werden. Diese Anzahl wird von p subtrahiert, um die maximale Anzahl der Stellen links von der Dezimalstelle zu bestimmen. Die Anzahl von Dezimalstellen muss ein Wert zwischen 0 und p sein und kann nur festgelegt werden, wenn die Genauigkeit angegeben wird. Die Standardskala lautet 0
usw 0 <= s <= p
. Die maximalen Speichergrößen variieren abhängig von der Genauigkeit.
Precision | Speicherplatz in Bytes |
---|---|
1 – 9 | 5 |
10–19 | 9 |
20–28 | 13 |
29–38 | 17 |
Hinweis
Informatica (über den SQL Server PDW-Informatica-Connector verbunden) unterstützt unabhängig von der angegebenen Präzision und dem Dezimalstellenwert nur 16 signifikante Ziffern.
Konvertieren von Dezimal- und numerischen Daten
Im Fall der Datentypen decimal und numeric sieht SQL Server jede Kombination aus Genauigkeit und Anzahl von Dezimalstellen als einen anderen Datentyp an. decimal(5,5) und decimal(5,0) werden beispielsweise als unterschiedliche Datentypen erachtet.
In Transact-SQLAnweisungen wird eine Konstante mit einem Dezimaltrennzeichen automatisch in einen Wert des numeric-Datentyps konvertiert. Hierbei werden die mindestens erforderliche Genauigkeit und die Anzahl von Dezimalstellen verwendet. Die Konstante 12.345
wird z. B. in einen numerischen Wert konvertiert, mit einer Genauigkeit von 5
, und einer Skalierung von 3
.
Konvertierung von | Konvertierung in | Konvertierungsrisiko |
---|---|---|
decimal und numeric | float oder real | Möglicher Genauigkeitsverlust |
int, smallint, tinyint, float, real, money, or smallmoney | decimal und numeric | Möglicher Überlauf |
Bei der Konvertierung einer Zahl in einen Wert des Typs decimal oder numeric mit einer geringeren Genauigkeit und einer geringeren Anzahl von Dezimalstellen wird der Wert standardmäßig von SQL Server gerundet. Wenn die SET ARITHABORT
Option dagegen lautet ON
, löst SQL Server beim Überlauf einen Fehler aus. Eine Verringerung der Genauigkeit und der Anzahl von Dezimalstellen reicht zum Auslösen eines Fehlers nicht aus.
Vor SQL Server 2016 (13.x) ist die Konvertierung von Gleitkommawerten in Dezimal - oder numerische Werte nur auf Werte mit Genauigkeit von 17 Ziffern beschränkt. Jeder Float-Wert kleiner als 5E-18
(bei Verwendung der wissenschaftlichen Schreibweise oder 5E-18
der Dezimalnotation von 0.000000000000000005
) rundet auf 0
. Diese Einschränkung wird in SQL Server 2016 (13.x) und höheren Versionen nicht angezeigt.
Beispiele
Im folgenden Beispiel wird eine Tabelle mit decimal- und numeric-Datentypen erstellt. Werte werden in den einzelnen Spalten eingefügt. Die Ergebnisse werden mithilfe einer SELECT
Anweisung zurückgegeben.
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;
Hier sehen Sie das Ergebnis.
MyDecimalColumn MyNumericColumn
---------------- ----------------
123.00 12345.12000