从SQL分页行

我正在尝试完成我的新闻/博客ASP.net C#应用程序的编写,并且我在如何根据标记或关键字过滤项目后一次只返回10个项目。 这是我正在寻找的一个例子:

  1. 用户通过浏览到?tag = Pizza来查询sql
  2. 后端查找所有与查询字符串相等的标记(作为@参数发送)。 这部分我已经想通了。
  3. 现在我希望它从这个过滤后的语句中一次只返回10行。 当我没有过滤任何东西时,我很容易就能做到这一点:

    sqlCommand.CommandText = "SELECT * FROM (SELECT row_number() over(ORDER BY news_id) AS row_number, * FROM news) T WHERE row_number BETWEEN (SELECT rowcnt FROM sys.sysindexes WHERE (id = OBJECT_ID('news')) AND (indid < 2))-(@start+10) AND (SELECT rowcnt FROM sys.sysindexes WHERE (id = OBJECT_ID('news')) AND (indid < 2))-(@start) ORDER BY news_id DESC"; sqlCommand.Parameters.Add("@start", SqlDbType.Int).Value = start; 
  4. 然后,我在页面底部显示用户可以查看更多内容的选项。 (这部分很简单,因为我只需要将10添加到查询字符串?num =)。

实现这一目标的最佳方式是什么?

理解row_number如何对结果进行编号最初有点棘手。

看起来有两件事情让它变得更加复杂。 row_number函数必须发生过滤的SELECT或外部SELECT相同 ,否则您将对整个表进行编号,而不是对结果进行编号。 在行被限制之前,您的查询对表中的所有结果进行了编号因为row_number用于SELECT 内部的SELECT和WHERE。

其次,当你可以将一个DESC添加到row_number函数时,看起来你正在命中sys.indexes以获得行数(我不确定总是准确的)到反向的行号范围。

 SELECT * FROM ( SELECT row_number() over(ORDER BY news_id DESC) AS row_number, * FROM news WHERE --user filter goes here news_cat = 'Pizza' ) AS T WHERE row_number BETWEEN @start AND @start + 10 

请参阅有关SQL Server分页查询的以下问题:

  • 分页SQL Server 2005结果
  • 如何在SQL Server 2008中进行分页
  • 如何从SQL返回结果页面?
  • SQL Server中的分页
  • 在MS SQLServer中分页结果的最佳方法是什么
  • 如何在SQL Server 2000中对结果进行服务器端分页?

等等。

我在2年前的codeproject上写了这篇文章,当分页支持在框架中仍然相当有限时,或许仍然是一个很好的参考。

如果您只关心数据,请查看我如何检索分页数据的部分。

http://www.codeproject.com/KB/aspnet/GridViewNeatPaging.aspx