1

以下查询生成错误消息

(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 数据类型导致值超出范围。

4

2 回答 2

4

表达式的所有分支case都将转换为具有最高优先级的分支的数据类型。

datetime具有更高的优先级,varchar因此它将尝试将AccessionNumber值转换为datetime. 您可以使用显式转换sql_variant如下。

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

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

于 2011-11-03T13:49:21.917 回答
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 

ie : First Order By one colunm THEN by another .... 像这样..

于 2011-11-03T13:59:19.207 回答