以下查询生成错误消息
(SELECT ROW_NUMBER() OVER(ORDER BY (CASE @SortBy
WHEN 'AccessionNumber' THEN [AccessionNumber]
WHEN 'CreatedDate' THEN CreatedDate
END))AS RowNumber
哪里
@SortBy VARCHAR(50) = 'AccessionNumber'
作为参数传递。
错误:
将varchar数据类型转换为日期时间数据类型会导致超出范围的值。
答案 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然后另一个......就像这样......