Laut BOL für SQL Server 2008 R2 erfordert der Datentyp Dezimal die folgenden Speicherbytes:
Precision Storage bytes
1 - 9 => 5
10-19 => 9
20-28 => 13
29-38 => 17
Wenn ich jedoch eine Datenlänge () für eine Spalte mache, die dezimal (19,5) formatiert ist und den Wert 10999.99999 hat, erhalte ich 5 Bytes zurück? Das ist nach meinem Verständnis eine Genauigkeit von 10 und nicht von 9 und sollte zu 9 Bytes führen.
Dies führt zu zwei Fragen:
Hängt die Größe der Tabelle mit dieser Spalte nicht von der Spaltendefinition ab, sondern definieren die wahren Werte innerhalb der Spalte die Tabellengröße?
Warum stimmen die Informationen in BOL nicht mit den Daten überein, die () zurückgibt?
DATALENGTHMeldung von 5 oder 9 Bytes in diesem Fall scheint 42949.67295(gespeichert als 01 FF FF FF FF 00 00 00 00) und 42949.67296(gespeichert als 01 00 00 00 00 01 00 00 00) zu sein. Ich bin mir nicht sicher, wie nützlich dieses Verhalten genau ist!
CREATE TABLE [Test195]( [Date] [date] NULL, [Time] [time](3) NULL, [CCYPairID] [tinyint] NULL, [Price] [decimal](19, 5) NULL, [Amount] [bigint] NULL, ) SELECT [Date] ,[Time] ,[CCYPairID] ,DATALENGTH([CCYPairID]) as CByte ,[Price] ,DATALENGTH([Price]) as PByte ,[Amount] ,DATALENGTH([Amount]) as AByte FROM [Test195]