SQL Server 2008 сортирует дату в ROW_NUMBER()

#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. Это вообще не обязательно делать так, как показывает мой ответ.