Давайте попробуем еще несколько примеров ...
ROW_NUMBER() OVER (ORDER BY 2/1)
Оконные функции и функции NEXT VALUE FOR не поддерживают целое число
индексы как выражения предложения ORDER BY.
Проблема с 2/1
заключается в том, что он рано сворачивается до 2
в начале процесса оптимизации, поэтому обрабатывается так же, как ROW_NUMBER() OVER (ORDER BY 2)
, что недопустимо.
ROW_NUMBER() OVER (ORDER BY LOG(1))
Оконные функции и функции NEXT VALUE FOR не поддерживают
константы как выражения предложения ORDER BY.
Снова включается постоянное свертывание - на этот раз результат не является целочисленным индексом, но SQL Server все равно не разрешает константы.
ROW_NUMBER() OVER (ORDER BY LOG(-1))
Это успешно выполняется в последних версиях SQL Server - в старых версиях, таких как SQL Server 2008, вы увидите An invalid floating point operation occurred.
. Этот конкретный случай упоминается в контексте CASE
здесь . Свертывание постоянной времени компиляции нарушило семантику CASE
, и это было исправлено в более поздних версиях.
Подавление постоянного свертывания в этих случаях ошибок (LOG(-1)
и 1/0
) достаточно, чтобы обойти проверки, которые выдают сообщения об ошибках выше. Однако SQL Server по-прежнему признает, что выражение на самом деле является константой и может быть оптимизировано позже (поэтому вы не получите операцию сортировки, чтобы упорядочить строки по результату этого выражения).
Во время фазы упрощения ROW_NUMBER ORDER BY non_folded_const_expression
упрощается до ROW_NUMBER
и non_folded_const_expression
удаляется из дерева, поскольку на него больше нет ссылок. Таким образом, это не вызывает проблем во время выполнения, поскольку даже не существует в окончательном плане выполнения.