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 作为存储过程中的参数的主要内容,如果未能解决你的问题,请参考以下文章
将 xml 作为参数传递给 SQL Server 中的存储过程