2012-08-30 7 views
6

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.

+0

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 –

Antwort

5

I vorgelegten Bericht einen Fehler zu verbinden: Misleading documentation on the decimal data type

+1

Oh und zu denen, die mich ablehnen, lesen Sie bitte ein wenig genauer. Zwei Experten oben haben beide in den Kommentaren unten ihre Antworten zugegeben, dass dies ein Fehler oder eine Unterlassung in den Dokumenten ist. Dies ist nicht das erste Mal, dass ich Fehler in MSDN gefunden habe, bei denen der genaue Wortlaut nicht dem Verhalten der Sprache entspricht. Das letzte Mal war nur ein paar Monate her, und Jon Skeet stimmte nicht nur zu, aber ein MS-Mitarbeiter half dabei, den Bugreport auf Connect mitzunehmen und die Dokumente zu ändern: http://stackoverflow.com/questions/9689839/msdn -documentation-error-Wenn-die-Prozedur-ist-shared-all-it-local-Variablen-a. –

+2

MS hat auf meinen Fehlerbericht geantwortet und die Dokumentation für SQL Server 2012 wie vorgeschlagen aktualisiert. https://connect.microsoft.com/SQLServer/feedback/details/760495/. Nimm das, downvoters :-) –

+1

Ich bin upvoting, um einige der downvotes zu negieren, weil die Dokumentation * ist * falsch und die ursprüngliche Frage und diese Antwort sind richtig darauf hin, dass heraus. –

10

10 - 9 ist 1. DECIMAL(10, 9) kann eine Nummer im Format 0.000000000 enthalten. 50 hat zwei Stellen vor dem Dezimalpunkt und liegt daher außerhalb des Bereichs. Sie zitierte es selbst:

According to the MSDN documentation on decimal(p, s), p (or 10 in my case) is the "maximum total number of decimal digits that can be stored, both to the left and to the right of the decimal point" whereas s (or 9 in my case) is the "maximum number of decimal digits that can be stored to the right of the decimal point."

+2

"DECIMAL (10, 9) kann eine Zahl im Format 0.000000000 enthalten." Wie folgt das aus der Dokumentation? Es geht nicht um das Subtrahieren von * s * von * p *, sondern um die insgesamt maximal speicherbaren * Ziffern und auf der rechten Seite. Da 50 keine auf der rechten Seite hat, sollte es folgen, dass alle 10 verbleibenden * Gesamt * Ziffern auf der linken Seite verwendet werden können. –

+0

@JordanRieger: Nein, Sie haben angegeben, dass die Genauigkeit 9 nach links ist, also 9 nach links und 1 nach rechts. Es variiert nicht. – Ryan

+1

Ich denke du meinst 9 an das * Recht *. Wo sagt der Arzt, dass (10, 9) bedeutet, dass * immer * 9 Ziffern auf der rechten Seite sind? Es heißt nur, dass das * Maximum * auf der rechten Seite 9 ist. –

2

Eine vernünftige Art und Weise der Dokumentation ist, dass Hinter dezimal Null-Ziffern sind nicht ignoriert zu interpretieren. Ihre Nummer hat also 9 Dezimalziffern rechts vom Komma, und sie sind alle 0.

+0

Nein, weil es eine unendliche Anzahl von Nullstellen geben könnte. Was ist zu sagen, dass die Zahl "50" 9 oder 999 nachgestellte Nullen hat? –

+0

Der Parameter 's' in Ihrem Typ 'DECIMAL (p, s)' gibt genau an, wie viele nachlaufende Ziffern in der Repräsentation gespeichert werden. –

+0

Nein, laut den Dokumenten gibt es die * maximale * Anzahl der nachgestellten Ziffern an. Bitte haben Sie Verständnis dafür, dass ich das Verhalten von SQL Server nicht in Frage stelle, sondern den Wortlaut der Dokumente in Frage stelle. –

1

DECIMAL(10, 9) ist ein numerischer Datentyp mit fester Genauigkeit und Skalierung. Dies bedeutet, dass immer die gleiche Anzahl von Ziffern rechts vom Dezimalpunkt gespeichert wird. Der von Ihnen angegebene Datentyp kann also nur Zahlen mit einer Ziffer nach dem Dezimalpunkt und 9 Ziffern nach rechts speichern. Offensichtlich passt 50 nicht in eine Anzahl dieses Formats.

1

Go obwohl den Link unten. http://msdn.microsoft.com/en-gb/library/ms190476.aspx

Präzision ist die Anzahl der Ziffern in einer Zahl. Scale ist die Anzahl der Stellen rechts vom Dezimalpunkt in einer Zahl. Beispiel: Die Zahl 123.45 hat eine Genauigkeit von 5 und eine Skalierung von 2.

+0

Leider steht diese Definition in Konflikt mit http://msdn.microsoft.com/en-us/library/ms187746(v=sql.110).aspx, die das Wort "Maximum" verwendet, weshalb zwei separate Microsoft-Mitarbeiter meine angenommen haben Einreichung, um die irreführende Dokumentation zu ändern. Siehe https://connect.microsoft.com/SQLServer/feedback/details/760495/misleading-documentation-on-the-decimal-data-type. Alles, was sie tun müssen, ist das Wort "Maximum" zu entfernen und "can" in "will" in der "s" Definition zu ändern und den anderen Satz, den ich in meiner ursprünglichen Frage erwähnt habe, hinzuzufügen. Sieht so aus, als ob sie es noch nicht geschafft haben :) –

Verwandte Themen