SQL Server 2008在ROW_NUMBER()中的排序日期

时间:2011-11-03 13:44:24

标签: sql-server-2008 sql-order-by row-number

以下查询生成错误消息

(SELECT ROW_NUMBER() OVER(ORDER BY (CASE @SortBy
    WHEN 'AccessionNumber' THEN  [AccessionNumber]
    WHEN 'CreatedDate' THEN  CreatedDate
END))AS RowNumber

哪里

@SortBy VARCHAR(50) = 'AccessionNumber' 

作为参数传递。

错误:

  

将varchar数据类型转换为日期时间数据类型会导致超出范围的值。

2 个答案:

答案 0 :(得分:4)

case表达式的所有分支都将转换为the highest precedence分支的数据类型。

datetime的优先级高于varchar,因此它会尝试将AccessionNumber值转换为datetime。您可以使用显式转换为sql_variant,如下所示。

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

您应该知道这种动态排序条件不会使用索引来避免排序。

答案 1 :(得分:0)

必须这样做。

(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 

即:第一顺序由一个colunm然后另一个......就像这样......