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

Posted

技术标签:

【中文标题】DESC 和 ASC 作为存储过程中的参数【英文标题】:DESC and ASC as a parameter in stored procedure 【发布时间】:2012-04-04 21:49:32 【问题描述】:

我有以下 SP 用于对新闻文章列表进行分页。您可能已经猜到了,@count 是要返回的行数,@start 是从中选择行的索引(按内部查询排序),@orderby 表示要排序的列,@orderdir指示是否对一个方向或另一个方向进行排序。我原来的查询是 here,在我添加@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 作为该参数完全相同的结果。

【问题讨论】:

这能回答你的问题吗? SQL stored procedure passing parameter into "order by" @RaúlDiego 也许吧,但这就像 9 年前一样,当时接受的答案非常有效,所以我要离开了。 【参考方案1】:

不会在每一行上评估行号,但是 case 语句是这样的,所以不管是什么情况,你都会被 rownum 卡住。

试试这个:

            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
                )

【讨论】:

是的,这正是我想要的,现在你已经把它写下来了,看起来很明显。谢谢,必须等待将其标记为答案。 没有汗水。在 row_number 出来之前,我曾几次为这些东西挠头。【参考方案2】:

这对我来说很好 - (where,order by,direction,offset fetch)

       -- parameters

        @orderColumn  int ,
        @orderDir  varchar(20),
        @start  int ,
        @limit  int


        select * from items
        WHERE        (items.status = 1) 
        order by 

        CASE WHEN @orderColumn = 0 AND @orderdir = 'desc' THEN items.[category] END DESC,    
        CASE WHEN @orderColumn = 0 AND @orderdir = 'asc' THEN items.[category] END ASC,    
        CASE WHEN @orderColumn = 1 AND @orderdir = 'desc' THEN items.[category] END DESC,
        CASE WHEN @orderColumn = 1 AND @orderdir = 'asc' THEN items.[category] END ASC,
        CASE WHEN @orderColumn = 2 AND @orderdir = 'desc' THEN items.[category] END DESC,
        CASE WHEN @orderColumn = 2 AND @orderdir = 'asc' THEN items.[category] END ASC

        OFFSET @start ROWS FETCH NEXT @limit ROWS ONLY 

【讨论】:

以上是关于DESC 和 ASC 作为存储过程中的参数的主要内容,如果未能解决你的问题,请参考以下文章

将表中的列值作为参数传递给存储过程 sql

临时表作为存储过程中的输出参数

以列名作为输入参数的存储过程中的动态 sql

将 xml 作为参数传递给 SQL Server 中的存储过程

访问数据库表中的值,并把它们作为一个参数,在MySQL存储过程

使用 SSIS 中的参数作为 OLE DB 源执行存储过程