Ответ 1
Итак, мы провели некоторое тестирование на SQL Server. Похоже, что тип sql decimal
не может полностью хранить .net десятичное число.
SQL Server может хранить число до 38 десятичных цифр в длину. Это общее количество цифр слева и справа от десятичной точки. Вы устанавливаете "Масштаб", который сообщает SQL-серверу, сколько десятичных цифр зарезервировано для числа справа от десятичной точки. Если вы установите масштаб, который уберет от числа цифр слева от десятичной точки. (Precision - Scale = число десятичных цифр слева от десятичной точки)
.NET может представлять до 28 цифр справа от десятичной точки и 29 влево. Это потребует точности 57 в SQL Server, но максимальная доступность - 38.
Итак, если вы хотите получить как можно больше точности, а ваш номер достаточно мал, вы можете сделать это:
decimal(38, 28)
Это оставит вас с 10 цифрами влево и 28 цифрами справа. Поэтому любое число, превышающее 9999999999, не может быть представлено, но вы не потеряете точность при совершении транзакций валютного типа.
С другой стороны, если ваши номера очень велики, вы можете сохранить их с помощью этого объявления:
decimal(38, 9)
Это позволит вам хранить самое большое число, которое может хранить десятичный символ .net, что равно 29 цифрам. Это оставило бы вас с точностью до 8 десятичных цифр.
Если ни одно из этих звуков не привлекательно, вы можете просто сохранить их как varchar
. Это позволит вам сохранить любое .net десятичное число, но это не позволит вам выполнять какие-либо вычисления на них в SQL.