Dieser ist ziemlich einfach. Warum verursacht der folgende Code den Fehler unten?Dezimal (10,9) Variable kann nicht die Zahl 50 enthalten (SQL Server 2008)
declare @dTest decimal(10, 9)
set @dTest = 50
Fehler:
Msg 8115, Level 16, State 8, Line 3
Arithmetic overflow error converting int to data type numeric.
Nach der MSDN documentation auf decimal(p, s)
, p
(oder 10 in meinem Fall) ist die „maximale Anzahl der Dezimalstellen, die gespeichert werden können, sowohl nach links und rechts vom Dezimalpunkt "wobei s
(oder 9 in meinem Fall) ist die" maximale Anzahl der Dezimalstellen, die rechts der d gespeichert werden kann Umweltzeichen. "
Meine Nummer 50, hat nur 2 Ziffern total (die kleiner als die maximalen 10) und 0 Ziffern rechts vom Komma (, die kleiner als die maximale 9 ist), daher sollte es funktionieren .
Ich fand this question über im Wesentlichen das gleiche Problem, aber niemand erklärte, warum die Dokumentation mit dem Verhalten zu widersprechen scheint. Es scheint, wie die s
Dimension tatsächlich als feste Anzahl der Ziffern rechts vom Komma interpretiert wird, und sein subtrahiert vom p-Nummer, die in meinem Fall verlässt 10-9 = nur 1 Stelle verbleibenden mit der linken Seite umgehen.
Kann jemand eine vernünftige Möglichkeit bieten, die Dokumentation so zu interpretieren, dass sie dem Verhalten entspricht?
EDIT:
Ich sehe einige Erklärungen unten, aber sie beziehen sich nicht auf das Grundproblem mit dem Wortlaut der Dokumente. Ich würde diese Änderung in der Formulierung vorschlagen:
Für „p (Genauigkeit)“ change „Die maximale Gesamtanzahl der Dezimalstellen, die gespeichert werden können“ „Die maximale Gesamtzahl der Dezimalstellen, dass wird gespeichert werden“ lesen .
Und für "s (scale)" ändern "Die maximale Anzahl der Dezimalstellen, die rechts vom Dezimalpunkt gespeichert werden können." zu "Die Anzahl der Dezimalstellen, die werden rechts vom Komma gespeichert werden. Diese Zahl wird von p subtrahiert, um die maximale Anzahl der Ziffern auf der linken Seite des Dezimalpunkts zu bestimmen."
Ich werde einen Fehlerbericht an Connect senden, es sei denn, jemand hat eine bessere Erklärung.
MS hat auf meinen Fehlerbericht geantwortet und die Dokumentation für SQL Server 2012 wie vorgeschlagen aktualisiert. Siehe https://connect.microsoft.com/SQLServer/feedback/details/760495/. Nimm das, Downvoters! : P –