SELECT $(знак доллара)
У меня есть хороший опыт работы в SQL Server,
Но неожиданно я обнаружил эту странную команду SELECT
SELECT $
или
SELECT $ FROM tableName
Все время возвращается нулевое скалярное значение (0.00
),
или новый столбец со всеми значениями 0.00
Что это?
Ответы
Ответ 1
Когда SQL Server встречает ваш знак $
, он автоматически преобразует его в тип данных money
. Поскольку у вас нет явного значения после знака доллара, SQL Server принимает значение 0.00
. Из MSDN:
При конвертации в money
или smallmoney
money
целые числа считаются денежными единицами. Например, целочисленное значение 4 преобразуется в денежный эквивалент 4 долларов (для us_english - язык по умолчанию). Числа справа от десятичного числа в значениях с плавающей запятой округляются до четырех знаков после запятой для денежных значений. Выражения типов данных char или varchar, которые преобразуются в целочисленный тип данных, должны состоять только из цифр и необязательного знака плюс или минус (+ или -). Ведущие пробелы игнорируются. Выражения типов данных char или varchar, преобразованные в деньги, могут также включать необязательную десятичную точку и ведущий знак доллара ($).
Ответ 2
После небольшого перебора я понял, что это происходит независимо от того, какой символ валюты используется, SQL-сервер подразумевает, что это поле является полем валюты.
Если вы добавите цифры после символа валюты, в этом случае доллар так:
SELECT $4
SQL-сервер вернет 4.00
Таким образом, SQL Server использует $ и предполагает, что мы хотим создать поле с типом данных MONEY, и поскольку мы не ввели значение после символа валюты, SQL Server предполагает, что значение равно 0, хотя, по моему мнению, это должно вернуть ЗНАЧЕНИЕ NULL.
Ответ 3
Вы можете доказать, что SQL Server рассматривает его как тип money
:
select $ as n into #x
exec tempdb..sp_help '#x'
sp_help
выведет (среди прочего):
Column_name Type Computed Length Prec Scale Nullable TrimTrailingBlanks FixedLenNullInSource Collation
-------------- ------- ----------- --------- ------- -------- ----------- --------------------- ----------------------- ------------
n money no 8 19 4 no (n/a) (n/a) (null)