Вы можете подсчитать общее количество строк в виде отдельного столбца в основном запросе, используя COUNT (*). Как это:
WITH SelectedItems AS
(SELECT Id, Row1, Row2, ROW_NUMBER() OVER (ORDER BY Row1) AS Position,
COUNT(*) OVER () AS TotalRows
FROM Items
WHERE Row2 = @Row2)
SELECT Id, Row1, Row2
FROM SelectedItems
WHERE Position BETWEEN @From AND @To
Это вернет счет в вашем наборе результатов, а не в выходном параметре, но это должно соответствовать вашим требованиям. В противном случае объедините с временной таблицей:
DECLARE @tmp TABLE (Id int, RowNum int, TotalRows int);
WITH SelectedItems AS
(SELECT Id, Row1, Row2, ROW_NUMBER() OVER (ORDER BY Row1) AS Position,
COUNT(*) OVER () AS TotalRows
FROM Items
WHERE Row2 = @Row2)
INSERT @tmp
SELECT Id, Row1, Row2
FROM SelectedItems
WHERE Position BETWEEN @From AND @To
SELECT TOP 1 @TotalRows = TotalRows FROM @tmp
SELECT * FROM @tmp
Вы обнаружите, что использование временной таблицы только для вашего постраничного результата не будет занимать много памяти (конечно, в зависимости от размера страницы), и вы сохраняете ее в течение короткого периода времени. Выбор полного набора результатов из временной таблицы и выбор TotalRows займет немного больше времени.
Это будет намного быстрее, чем выполнение совершенно отдельного запроса, который в моем тесте (повторяющий WITH) удвоил время выполнения.