一尘不染

SQL Server动态排序依据

sql

我试图在存储过程中使用动态顺序,因此我可以将希望数据返回的顺序作为参数传递给存储过程。这对于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语句,则可以按此字段排序。

有任何想法吗?


阅读 175

收藏
2021-03-10

共1个答案

一尘不染

更改为此:

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
2021-03-10