2010-04-13 6 views
1

J'essaie d'écrire une instruction d'insertion pour une table SQL Server qui insère la valeur 1 dans un champ décimal. Le champ est du type décimal (10, 10) qui, autant que je comprends, signifie qu'il peut avoir jusqu'à 10 chiffres tout à fait, et jusqu'à 10 de ces chiffres peuvent être après le point décimal. Mais, lorsque je tente d'exécuter l'instruction d'insertion je reçois l'erreur suivante:Pourquoi ne puis-je pas entrer une valeur entière dans un champ décimal?

Arithmetic overflow error converting int to data type numeric. 

Si je change le type de données du champ décimal (11, 10), cela fonctionne tout à coup. Qu'est-ce que je ne comprends pas ici? Qu'est-ce que je fais mal?

Répondre

12

decimal(10, 10) signifie toutes les décimales, aucun chiffre à gauche de la virgule décimale!

voir ici: http://msdn.microsoft.com/en-us/library/aa258832(SQL.80).aspx_

decimal[(p[, s])]

p (precision) Specifies the maximum total number of decimal digits that can be stored, both to the left and to the right of the decimal point. The precision must be a value from 1 through the maximum precision. The maximum precision is 38. The default precision is 18.

s (scale) Specifies the maximum number of decimal digits that can be stored to the right of the decimal point. Scale must be a value from 0 through p. Scale can be specified only if precision is specified. The default scale is 0; therefore, 0 <= s <= p. Maximum storage sizes vary, based on the precision.

decimal(11,10) vous donne 1 chiffre la gauche de la décimale et 10 à droite, donc entier 1 correspond maintenant!

EDIT

lors de l'utilisation: decimal(p,s), pensez à p que le nombre de chiffres au total (quel que soit à gauche ou à droite du point décimal) que vous voulez stocker et s que le nombre de ces p chiffres devraient être à la droite de la virgule décimale.

DECIMAL(10,5)=  12345.12345 
DECIMAL(10,2)= 12345678.12 
DECIMAL(10,10)=   .1234567891 
DECIMAL(11,10)=  1.1234567891 
+0

Je suis toujours confus. Il dit que l'échelle est le "* maximum * nombre de chiffres décimaux qui peuvent être stockés à la droite de la virgule décimale" - pas qu'il doit y en avoir 10. – froadie

+1

Oui, mais cela ne veut pas dire que c'est un point décimal glissant. L'implication est que si vous fournissez moins de 10 chiffres à droite, le reste est des zéros. – Joe

+0

@Joe, je ne suis pas sûr exactement ce que vous essayez de dire, mais si vous exécutez 'declare @x decimal (5,2), définissez @ x = 1.123456789; sélectionnez @x; définissez @ x = 1; sélectionnez @ x' vous obtiendrez '1.12' et' 1.00'. Une fois que vous avez déclaré une décimale, le nombre de chiffres à gauche et à droite de la virgule décimale est fixe, il n'y a pas de glissement de la virgule décimale. –