<p>Obtenir le nombre total de résultats et paginer sont deux opérations différentes. Pour les besoins de cet exemple, supposons que la requête que vous traitez est</p>
<pre><code class="lang-auto">SELECT * FROM Orders WHERE OrderDate >= '1980-01-01' ORDER BY OrderDate
</code></pre>
<p>Dans ce cas, vous détermineriez le nombre total de résultats en utilisant :</p>
<pre><code class="lang-auto">SELECT COUNT(*) FROM Orders WHERE OrderDate >= '1980-01-01'
</code></pre>
<p>…ce qui peut sembler inefficace, mais est en réalité assez performant, à condition que tous les index, etc., soient correctement configurés.</p>
<p>Ensuite, pour obtenir les résultats réels de manière paginée, la requête suivante serait la plus efficace :</p>
<pre><code class="lang-auto">SELECT *
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum, *
FROM Orders
WHERE OrderDate >= '1980-01-01'
) AS RowConstrainedResult
WHERE RowNum >= 1
AND RowNum < 20
ORDER BY RowNum
</code></pre>
<p>Cela renverra les lignes 1 à 19 de la requête originale. L’avantage ici, notamment pour les applications web, est que vous n’avez pas besoin de conserver d’état, à l’exception des numéros de lignes à renvoyer.</p>