t-sql десятичное присваивание меняет значение - PullRequest
1 голос
/ 13 ноября 2008

Почему оператор выбора ниже возвращает два разных значения?

declare @tempDec decimal
set @tempDec = 1.0 / (1.0 + 1.0)
select @tempDec, 1.0 / (1.0 + 1.0)

Ответы [ 2 ]

3 голосов
/ 14 ноября 2008

Это хорошо для литералов, таких как 1.0, но если вы извлекаете данные из столбцов таблицы, вам нужно привести / преобразовать первое вычисленное число в вашем уравнении:

convert(decimal, [col1]) / ([col2] + [col3])

-или-

convert(decimal(15, 2), [col1]) / ([col2] + [col3])
1 голос
/ 13 ноября 2008

Я узнал от коллеги, как только я написал это.

Вам необходимо указать точность и масштаб по умолчанию.

Это работает в этом сценарии: объявить десятичное значение @tempDec (3,2)

Из MSDN:

десятичное [(p [, s])] и числовое [(p [, s])] Исправлена ​​точность и масштабирование чисел. При использовании максимальной точности допустимые значения находятся в диапазоне от - 10 ^ 38 +1 до 10 ^ 38 - 1. Синонимами SQL-92 для десятичного числа являются dec и dec (p, s). числовое значение функционально эквивалентно десятичному.

p (точность) Максимальное общее количество десятичных цифр, которое может быть сохранено как слева, так и справа от десятичной точки. Точность должна быть от 1 до максимальной точности 38. Точность по умолчанию - 18.

с (шкала) Максимальное количество десятичных цифр, которое можно сохранить справа от десятичной точки. Масштаб должен быть от 0 до p. Масштаб может быть указан, только если указана точность. Масштаб по умолчанию - 0; следовательно, 0 <= s <= p. Максимальные размеры хранилища зависят от точности. </p>

...