#sql-server-2008 #sql-order-by #row-number
#sql-server-2008 #sql-order-by #номер строки
Вопрос:
Следующий запрос генерирует сообщение об ошибке
(SELECT ROW_NUMBER() OVER(ORDER BY (CASE @SortBy
WHEN 'AccessionNumber' THEN [AccessionNumber]
WHEN 'CreatedDate' THEN CreatedDate
END))AS RowNumber
Где
@SortBy VARCHAR(50) = 'AccessionNumber'
передается как параметр.
Ошибка :
Преобразование типа данных varchar в тип данных datetime привело к значению вне диапазона.
Ответ №1:
Все ветви case
выражения будут приведены к типу данных ветви с наивысшим приоритетом.
datetime
имеет более высокий приоритет, чем varchar
, поэтому он попытается привести AccessionNumber
значения к datetime
. Вы можете использовать явное приведение к sql_variant
, как показано ниже.
CASE @SortBy
WHEN 'AccessionNumber' THEN cast([AccessionNumber] as sql_variant)
WHEN 'CreatedDate' THEN CreatedDate
END
Вы должны знать, что такое условие динамической сортировки не будет использовать индекс, чтобы избежать сортировки.
Ответ №2:
Это должно быть сделано следующим образом.
(SELECT ROW_NUMBER() OVER
(
-- Dynamic sorting
ORDER BY
CASE WHEN @SortBy = 'AccessionNumber' THEN [AccessionNumber] END Asc ,
CASE WHEN @SortBy = 'CreatedDate' THEN CreatedDate END Asc
) as RowNo
то есть: сначала упорядочить по одному столбцу, ЗАТЕМ ПО другому …. вот так..
Комментарии:
1. Это вообще не обязательно делать так, как показывает мой ответ.