O procedimento armazenado T-SQL a seguir é um procedimento muito implementação eficiente de paginação. O otimizador SQL pode encontrar o primeiro ID muito rapidamente. Combine isso com o uso de ROWCOUNT e você terá uma abordagem que é eficiente em termos de CPU e de leitura. Para uma tabela com um grande número de linhas, certamente supera qualquer abordagem que tenha visto usando uma tabela temporária ou variável de tabela.
NB:estou usando uma coluna de identidade sequencial neste exemplo, mas o código funciona em qualquer coluna adequada para classificação de páginas. Além disso, as quebras de sequência na coluna que está sendo usada não afetam o resultado, pois o código seleciona um número de linhas em vez de um valor de coluna.
EDIT:Se você estiver classificando em uma coluna com valores potencialmente não exclusivos (por exemplo, LastName), adicione uma segunda coluna à cláusula Order By para tornar os valores de classificação exclusivos novamente.
CREATE PROCEDURE dbo.PagingTest
(
@PageNumber int,
@PageSize int
)
AS
DECLARE @FirstId int, @FirstRow int
SET @FirstRow = ( (@PageNumber - 1) * @PageSize ) + 1
SET ROWCOUNT @FirstRow
-- Add check here to ensure that @FirstRow is not
-- greater than the number of rows in the table.
SELECT @FirstId = [Id]
FROM dbo.TestTable
ORDER BY [Id]
SET ROWCOUNT @PageSize
SELECT *
FROM dbo.TestTable
WHERE [Id] >= @FirstId
ORDER BY [Id]
SET ROWCOUNT 0
GO