Así que hicimos algunas pruebas en SQL Server. Parece que el tipo sql decimal
no puede almacenar completamente cualquier decimal .net.
SQL Server puede almacenar un número hasta 38 decimal digits long. Ese es el total de la cantidad de dígitos a la izquierda y a la derecha del lugar decimal. Establece una 'Escala', que le dice al servidor SQL cuántos dígitos decimales debe reservar para el número a la derecha de la posición decimal. Si configura una escala, eso le quita la cantidad de dígitos a la izquierda del punto decimal. (Precisión - Escala = número de dígitos decimales a la izquierda del lugar decimal)
.NET puede representar hasta 28 dígitos a la derecha del punto decimal y 29 a la izquierda. Eso requeriría una precisión de 57 en SQL Server, pero el máximo disponible es 38.
Así que si quieres conseguir tanta precisión como sea posible y su número son lo suficientemente pequeño, entonces usted puede hacer esto:
decimal(38, 28)
Eso le dejaría con 10 dígitos a la izquierda y 28 dígitos a la derecha. Por lo tanto, no se podría representar cualquier número mayor a 9999999999, pero no se perderá precisión al realizar transacciones de tipo de moneda.
Por otro lado, si sus números son muy grandes podría almacenar con esta declaración:
decimal(38, 9)
Esto le permitiría almacenar el número más grande que puede almacenar decimal .NET, que es de 29 dígitos largo. Te dejaría con solo 8 dígitos decimales de precisión.
Si nada de esto suena atractivo, entonces puede simplemente almacenarlos como varchar
. Eso le permitiría guardar cualquier decimal .net pero no le permitiría realizar ningún cálculo sobre ellos en SQL.