我正在尝试在存储过程中使用动态顺序,因此我可以将我想要的数据作为参数传递给存储过程。这适用于VARCHAR字段但是如果我尝试对int或datetime字段进行排序,则会使我的代码出错,如下所示
DECLARE @ORDERBY INT
SET @ORDERBY = 1
SELECT TOP 10 * FROM TBL_LMS_USERS_RECORDs_LAST_ATTEMPT
ORDER BY
CASE
WHEN @OrderBy = 1 THEN s10_record_dow
--WHEN @OrderBy = 2 THEN pk_big_record_id
else s10_record_dow
END
如果我在case语句中取消注释第二个WHEN,则错误
“将数据类型varchar转换为bigint时出错。”
如果我不使用case语句,我可以通过此字段订购。
有什么想法吗?
答案 0 :(得分:8)
将其更改为:
SELECT TOP 10 * FROM TBL_LMS_USERS_RECORDs_LAST_ATTEMPT
ORDER BY
CASE WHEN @OrderBy = 1 THEN s10_record_dow ELSE NUll END,
CASE WHEN @OrderBy = 2 THEN pk_big_record_id ELSE NULL END,
CASE WHEN @OrderBy <> 1 AND @OrderBy <> 2 THEN s10_record_dow
ELSE NULL
END
答案 1 :(得分:3)
为什么不使用ROW_NUMBER()?
SELECT TOP 10
*,
CASE @SortBy
WHEN 'A' THEN ROW_NUMBER () OVER (ORDER BY s10_record_dow)
WHEN 'B' THEN ROW_NUMBER () OVER (ORDER BY pk_id)
END RowNumber
FROM TBL_LMS_USERS_RECORDs_LAST_ATTEMPT
然后您订购的列可以是任何类型。
答案 2 :(得分:0)
order by
(case when (@orderByAsc = 1) then r.SomeColumn end) asc,
(case when (@orderByAsc = 0) then r.SomeColumn end) desc
这是你升序或降序的方式