Sql DESC和ASC作为存储过程中的参数
我使用以下SP为新闻文章列表分页。您可以猜到,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
@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年前的事了,当时公认的答案非常有效,所以我就不谈了。