2011-11-03 88 views
1

下面的查询产生的错误信息的SQL Server 2008数据排序()

(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数据类型的转换导致外的范围内的值。

回答

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由另一个....这样的..

+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 

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