SQL Server动态排序依据

时间:2009-04-15 13:16:20

标签: sql sql-server

我正在尝试在存储过程中使用动态顺序,因此我可以将我想要的数据作为参数传递给存储过程。这适用于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语句,我可以通过此字段订购。

有什么想法吗?

3 个答案:

答案 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

这是你升序或降序的方式