Este es bastante sencillo. ¿Por qué el código siguiente causa el siguiente error?Variable decimal (10,9) no puede contener el número 50 (SQL Server 2008)
declare @dTest decimal(10, 9)
set @dTest = 50
Error:
Msg 8115, Level 16, State 8, Line 3
Arithmetic overflow error converting int to data type numeric.
Según la MSDN documentation en decimal(p, s)
, p
(o 10 en mi caso) es el "número máximo total de dígitos decimales que se pueden almacenar, tanto a la izquierda y a la derecha del punto decimal "mientras que s
(o 9 en mi caso) es el" número máximo de dígitos decimales que se pueden almacenar a la derecha de la d punto ecimal ".
mi número, 50, tiene sólo 2 dígitos en total (que menos de los máximos 10), y 0 dígitos a la derecha del punto decimal (que es menor que el máximo 9), por lo tanto, debería funcionar .
Encontré this question esencialmente el mismo problema, pero nadie explicó por qué la documentación parece estar en conflicto con el comportamiento. Parece que la dimensión s
en realidad está siendo interpretado como el fija número de dígitos a la derecha del punto decimal, y siendo resta de la número p, que en mi caso deja 10-9 = 1 solo dígito restante para manejar el lado izquierdo.
¿Alguien puede proporcionar una forma razonable de interpretar la documentación tal como está escrita para que coincida con el comportamiento?
EDIT:
veo algunas explicaciones a continuación, pero no abordan el problema fundamental con el texto de los documentos. Yo sugeriría que este cambio en la redacción:
Por "p (precisión)" cambio "El número total máximo de dígitos decimales que se puede almacenar" leer "El número total máximo de dígitos decimales que se almacenar" .
Y para "s (scale)" change "El número máximo de dígitos decimales que se pueden almacenar a la derecha del punto decimal". a "Se almacenará a la derecha del punto decimal el número de dígitos decimales que . Este número se resta de p para determinar el número máximo de dígitos a la izquierda del punto decimal".
Voy a enviar un informe de error a Connect a menos que alguien tenga una mejor explicación.
MS respondió a mi informe de errores y ahora ha actualizado la documentación de SQL Server 2012 como sugerí. Consulte https://connect.microsoft.com/SQLServer/feedback/details/760495/. ¡Toma eso, downvoters! : P –