Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting total row count from OFFSET / FETCH NEXT

So, I've got a function that returns a number of records that I want to implement paging for on my website. It was suggested to me that I use the Offset/Fetch Next in SQL Server 2012 to accomplish this. On our website, we have an area that lists total number of records and what page you're on at the time.

Before, I was getting the entire record set and was able to build the paging on that programatically. But using the SQL way with FETCH NEXT X ROWS ONLY, I am only given back X rows, so I don't know what my total record set is and how to calculate my min and max pages. The only way I can tell of doing this is calling the function twice and doing a count of rows on the first, then running the second with FETCH NEXT. Is there a better way that won't have me running the query twice? I am trying to speed up performance, not slow it down.

like image 809
CrystalBlue Avatar asked Sep 10 '12 13:09

CrystalBlue


People also ask

How do you get total row count?

To counts all of the rows in a table, whether they contain NULL values or not, use COUNT(*). That form of the COUNT() function basically returns the number of rows in a result set returned by a SELECT statement.

What is the use of @@ rowcount?

Data manipulation language (DML) statements set the @@ROWCOUNT value to the number of rows affected by the query and return that value to the client. The DML statements may not send any rows to the client. DECLARE CURSOR and FETCH set the @@ROWCOUNT value to 1.


1 Answers

I encountered some performance issues using the COUNT() OVER() method. (I'm not sure if it was the server as it took 40 seconds to return 10 records and then later didn't have any issues.) This technique worked under all conditions without having to use COUNT() OVER() and accomplishes the same thing:

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 
like image 107
James Moberg Avatar answered Sep 16 '22 20:09

James Moberg