Die MySQL´er kennen die Funktion LIMIT mit der sich sehr einfach ein Paging darstellen läßt. Usern von MS SQL blieben solche Funktionen bislang verwehrt. Mit umständlichen Sub-Selects und ORDER BY war es schon möglich, etwas ähnliches hinzubekommen, leider nicht sehr perfomant. Aber MS hat Abhilfe geschaffen! Mit ROW_NUMBER() und OVER gehts fast so einfach und wirklich schnell.

siehe Sebastian Weber, MSDN und hier

Update:

OVER macht es nötig, ein ORDER BY-Statement in der Klammer anzugeben. Wenn jedoch im SELECT-Statement sowieso ein ORDER BY vorkommt, wird für die Zuweisung der Zeilennummern dieses verwendet und das dem OVER zugeordnete verworfen. Ist dies so, verlangt T-SQL aber zwingend die Angabe von TOP oder FROMXML. Ein TOP 100 PERCENT löst das Problem. Das macht es in vielen Fällen einfacher, mit ROW_NUMBER() zu hantieren.

Beispiele (100 Zeilen je Seite):

Beispiel 1:

WITH Beispiel AS (
SELECT Row_Number() OVER (ORDER BY Nachname, Vorname, Alter) AS Seite,
Testtabelle.*
FROM Testtabelle
) SELECT * FROM Beispiel WHERE Seite BETWEEN 1 AND 100

Beispiel 2:

WITH Beispiel AS (
SELECT TOP 100 PERCENT Row_Number() OVER (ORDER BY TabellenID) AS Seite,
Testtabelle.*
FROM Testtabelle
ORDER BY Nachname, Vorname, Alter
) SELECT * FROM Beispiel WHERE Seite BETWEEN 1 AND 100

Beispiel 3:

SELECT TOP 100 Testtabelle.*
FROM Testtabelle
ORDER BY Nachname, Vorname, Alter

Alle drei Beispiele liefern die gleichen 100 Datensätze. Die ersten beiden aber wesentlich schneller als die dritte. In einer etwas komplexeren Abfrage erreichten wir Zeitverbesserungen von 34sec. auf knapp 10sec.