从OFFSET / FETCH NEXT获取总行数

所以,我有一个函数返回一些我想在我的网站上实现分页的logging。 有人build议我在SQL Server 2012中使用偏移/取下一个来实现这一点。 在我们的网站上,我们有一个区域列出了当时的logging总数和您正在浏览的页面。

之前,我正在获取整个logging集,并能够以编程方式构build分页。 但是使用FETCH NEXT X ROWS ONLY的SQL方式,我只返回了X行,所以我不知道我的总logging集是什么,以及如何计算我的最小和最大页面。 我可以告诉这样做的唯一方法是调用函数两次,并在第一次做一个行的计数,然后运行FETCH NEXT第二。 有没有更好的方式,不会让我运行查询两次? 我正在努力加快性能,而不是放慢速度。

你可以使用COUNT(*) OVER() …这是一个使用sys.all_objects的简单例子:

 DECLARE @PageSize INT = 10, @PageNum INT = 1; SELECT name, object_id, overall_count = COUNT(*) OVER() FROM sys.all_objects ORDER BY name OFFSET (@PageNum-1)*@PageSize ROWS FETCH NEXT @PageSize ROWS ONLY; 

我使用COUNT( )OVER()方法遇到了一些性能问题 (我不确定这是否是服务器,因为它需要40秒钟才能返回10条logging,后来也没有任何问题。)这种技术在所有条件下工作,而不必使用COUNT( )OVER()并完成一样:

 DECLARE @PageSize INT = 10, @PageNum INT = 1; WITH TempResult AS( SELECT ID, Name FROM Table ), TempCount AS ( SELECT COUNT(*) AS MaxRows FROM TempResult ) SELECT * FROM TempResult, TempCount ORDER BY TempResult.Name OFFSET (@PageNum-1)*@PageSize ROWS FETCH NEXT @PageSize ROWS ONLY 

根据James Moberg的回答 :

这是使用Row_Number()的替代方法,如果您没有SQL Server 2012并且不能使用OFFSET

 DECLARE @PageNumEnd INT = 10, @PageNum INT = 1; WITH TempResult AS( SELECT ID, NAME FROM Tabla ), TempCount AS ( SELECT COUNT(*) AS MaxRows FROM TempResult ) select * from ( SELECT ROW_NUMBER() OVER ( ORDER BY PolizaId DESC) AS 'NumeroRenglon', MaxRows, ID, Name FROM TempResult, TempCount )resultados WHERE NumeroRenglon >= @PageNum AND NumeroRenglon <= @PageNumEnd ORDER BY NumeroRenglon