Sql DESC和ASC作为存储过程中的参数

Sql DESC和ASC作为存储过程中的参数,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我使用以下SP为新闻文章列表分页。您可以猜到,@count是要返回的行数,@start是从中选择行的索引(按内部查询排序),@orderby表示要排序的列,@orderdir表示是按一个方向排序还是按另一个方向排序。我最初的疑问是 ,然后添加@orderdir参数 ALTER PROCEDURE [mytable].[news_editor_paginate] @count int, @start int, @orderby int, @orderdir int

我使用以下SP为新闻文章列表分页。您可以猜到,
@count
是要返回的行数,
@start
是从中选择行的索引(按内部查询排序),
@orderby
表示要排序的列,
@orderdir
表示是按一个方向排序还是按另一个方向排序。我最初的疑问是 ,然后添加
@orderdir
参数

ALTER PROCEDURE [mytable].[news_editor_paginate]
    @count int,
    @start int,
    @orderby int,
    @orderdir int
AS 
BEGIN
    SET NOCOUNT ON; 
    SELECT TOP (@count) * FROM 
    (  
        SELECT ne.*,n.publishstate, 
            (CASE WHEN @orderdir = 1 THEN
                ROW_NUMBER() OVER (
                    ORDER BY                    
                        CASE WHEN @orderby = 0 THEN ne.[time] END DESC,
                        CASE WHEN @orderby = 1 THEN ne.lastedit END DESC,    
                        CASE WHEN @orderby = 2 THEN ne.title END ASC
                    )
            WHEN @orderdir = 2 THEN
                ROW_NUMBER() OVER (
                    ORDER BY                    
                        CASE WHEN @orderby = 0 THEN ne.[time] END ASC,    
                        CASE WHEN @orderby = 1 THEN ne.lastedit END ASC,
                        CASE WHEN @orderby = 2 THEN ne.title END DESC
                    )
                END
            ) AS num
            FROM news_edits AS ne
            LEFT OUTER JOIN news AS n
            ON n.editid = ne.id 
        ) 
     AS a
    WHERE num > @start
END

现在实际上没有什么问题,但是
@orderby
参数不起作用。如果提供1作为
@orderdir
参数,它将给出与我提供2作为该参数完全相同的结果。

不是对每一行都计算行号,但是case语句是这样的,因此无论是什么情况,都必须使用rownum

ALTER PROCEDURE [mytable].[news_editor_paginate]
    @count int,
    @start int,
    @orderby int,
    @orderdir int
AS 
BEGIN
    SET NOCOUNT ON; 
    SELECT TOP (@count) * FROM 
    (  
        SELECT ne.*,n.publishstate, 
            (CASE WHEN @orderdir = 1 THEN
                ROW_NUMBER() OVER (
                    ORDER BY                    
                        CASE WHEN @orderby = 0 THEN ne.[time] END DESC,
                        CASE WHEN @orderby = 1 THEN ne.lastedit END DESC,    
                        CASE WHEN @orderby = 2 THEN ne.title END ASC
                    )
            WHEN @orderdir = 2 THEN
                ROW_NUMBER() OVER (
                    ORDER BY                    
                        CASE WHEN @orderby = 0 THEN ne.[time] END ASC,    
                        CASE WHEN @orderby = 1 THEN ne.lastedit END ASC,
                        CASE WHEN @orderby = 2 THEN ne.title END DESC
                    )
                END
            ) AS num
            FROM news_edits AS ne
            LEFT OUTER JOIN news AS n
            ON n.editid = ne.id 
        ) 
     AS a
    WHERE num > @start
END
请尝试以下方法:

            ROW_NUMBER() OVER (
                ORDER BY                    
                    CASE WHEN @orderby = 0 AND @orderdir = 1 THEN ne.[time] END DESC,    
                    CASE WHEN @orderby = 0 AND @orderdir = 2 THEN ne.[time] END ASC,    
                    CASE WHEN @orderby = 1 AND @orderdir = 1 THEN ne.lastedit END DESC,
                    CASE WHEN @orderby = 1 AND @orderdir = 2 THEN ne.lastedit END ASC,
                    CASE WHEN @orderby = 2 AND @orderdir = 1 THEN ne.title END ASC
                    CASE WHEN @orderby = 2 AND @orderdir = 2 THEN ne.title END DESC
                )
这对我来说很好-(在哪里,按顺序,方向,偏移提取)


是的,这正是我想要的,现在你已经写下来了,这看起来很明显。谢谢,我得等一下把这个标记为答案。不用担心。当排号出来的时候,我对这些东西摸了几次头。这能回答你的问题吗@也许是劳尔迪戈,但这是9年前的事了,当时公认的答案非常有效,所以我就不谈了。