Дата сортировки в SQL Server 2008 в ROW_NUMBER () - PullRequest
1 голос
/ 03 ноября 2011

Следующий запрос генерирует сообщение об ошибке

(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 привело к значению вне допустимого диапазона.

Ответы [ 2 ]

4 голосов
/ 03 ноября 2011

Все ветви выражения case будут преобразованы в тип данных ветви с наивысшим приоритетом .

datetime имеет более высокий приоритет, чем varchar, поэтому он попытается привести AccessionNumber значения к datetime. Вы можете использовать явное приведение к sql_variant, как показано ниже.

CASE @SortBy
    WHEN 'AccessionNumber' THEN  cast([AccessionNumber] as sql_variant)
    WHEN 'CreatedDate' THEN  CreatedDate
END

Вы должны знать, что такого рода условие динамической сортировки не будет использовать индекс, чтобы избежать сортировки.

0 голосов
/ 03 ноября 2011

Это должно быть сделано так.

(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 

то есть: первый порядок одним столбцом, затем другим .... вот так ..

...