T-SQL знак доллара в выражениях

на ответ, есть трюк, который позволяет использовать ROW_NUMBER() оконная функция с "константой" в ORDER BY статья:

SELECT ROW_NUMBER() OVER (ORDER BY $/0) 
FROM master..spt_values 

после некоторого поиска в Google, я не могу найти что означает знак доллара в этом контексте?

Я попытался выполнить простой запрос:

SELECT $;

и он возвращается 0.

может кто-нибудь объяснить это?

2 ответов


Это просто money постоянный (то, что T-SQL называет литералами).

вы, вероятно, были бы менее удивлены, если бы увидели выражение .50, что было бы просто еще одной константой.

другие примеры: select £,¢,¤,¥,€ все возвращают 0s также.


может быть сложно определить, какой тип данных вы смотрите в T-SQL. Один трюк, если вы подозреваемый вы знаете, какой это тип, чтобы выбрать несовместимые тип и попытка преобразования:

select CONVERT(date,$)

результат:

Msg 529, Level 16, State 2, Line 1
Explicit conversion from data type money to date is not allowed.

спасибо @Damien_The_Unbeliever для указания в правильном направлении.

Я просто хотел бы добавить к его ответу результаты запроса, который дает точное описание, Что такое константы с $ вход:

  SELECT
    $ AS Value,
    SQL_VARIANT_PROPERTY ( $ , 'BaseType' ) AS BaseType,
    SQL_VARIANT_PROPERTY ( $ , 'Precision' ) AS Precision,
    SQL_VARIANT_PROPERTY ( $ , 'Scale' ) AS Scale,
    SQL_VARIANT_PROPERTY ( $ , 'TotalBytes' ) AS TotalBytes,
    SQL_VARIANT_PROPERTY ( $ , 'MaxLength' ) AS MaxLength
  UNION ALL
  SELECT
    .50,
    SQL_VARIANT_PROPERTY ( .50 , 'BaseType' ),
    SQL_VARIANT_PROPERTY ( .50 , 'Precision' ),
    SQL_VARIANT_PROPERTY ( .50 , 'Scale' ),
    SQL_VARIANT_PROPERTY ( .50 , 'TotalBytes' ),
    SQL_VARIANT_PROPERTY ( .50 , 'MaxLength' )

результаты:

Value   BaseType    Precision   Scale   TotalBytes  MaxLength  
0.00    money       19          4       10          8  
2.50    money       19          4       10          8