Przeprowadziliśmy testy na serwerze SQL. Wygląda na to, że sql type decimal
nie może w pełni przechowywać żadnego dziesiętnego .net.
Serwer SQL może przechowywać numer do 38 decimal digits long. To suma liczby cyfr po lewej i prawej stronie miejsca po przecinku. Ustawiasz "Skalę", która mówi serwerowi SQL, ile cyfr dziesiętnych ma zarezerwować dla liczby po prawej stronie miejsca dziesiętnego. Jeśli ustawisz skalę, która odejmuje liczbę cyfr po lewej stronie przecinka dziesiętnego. (Precyzja - Skala = liczba cyfr dziesiętnych po lewej stronie miejsca dziesiętnego)
. NET może reprezentować do 28 cyfr po prawej stronie przecinka dziesiętnego i 29 po lewej stronie. Wymagałoby to z dokładnością do 57 w SQL Server, ale maksymalna dostępna jest 38.
Więc jeśli chcesz uzyskać jak najwięcej precyzja jak to możliwe i numer są wystarczająco małe, to można to zrobić:
decimal(38, 28)
Zostanie Ci 10 cyfr po lewej i 28 cyfr po prawej. Tak więc żadna liczba większa niż 9999999999 nie może być reprezentowana, ale nie można stracić precyzji podczas dokonywania transakcji typu walutowego.
Z drugiej strony, jeśli numery są bardzo duże można przechowywać je z niniejszym oświadczeniem:
decimal(38, 9)
byłoby to pozwalają przechowywać największą liczbę osób, które mogą przechowywać .NET dziesiętny, który jest 29 cyfr długie. Zostawiłoby Ci tylko 8 cyfr dziesiętnych z dokładnością.
Jeśli nic nie brzmi zachęcająco, możesz je zapisać jako varchar
. To pozwoliłoby na zapisanie dowolnej wartości dziesiętnej .net, ale nie pozwoliłoby to na wykonywanie obliczeń w SQL.