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