LIMIT и SQL_CALC_FOUND_ROWS для MS SQL Server
В MySQL есть несколько полезных дополнений к стандартному SQL:
выборка диапазона записей с помощью конструкции LIMIT. Обычно используется для постраничного вывода записей.
подсчёт общего количества записей, возвращаемых запросом с LIMIT без отдельного запроса с
COUNT()с помощьюSQL_CALC_FOUND_ROWS.
Обычно, обе эти возможности используются одновременно.
В MS SQL Server аналогичных конструкций нет, что приводит к необходимости изобретать другие способы, порой весьма экзотические (особенно для SQL Server 2000).
Начиная с версии 2005 появилась функция ROW_NUMBER(), немного упростившая подобные запросы.
Пример:
SELECT * FROM ( SELECT *, COUNT(*) OVER () [TotalRows], ROW_NUMBER() OVER (ORDER BY [LogTimestamp] DESC) AS [RowNumber] FROM [Logs] LEFT JOIN [Users] ON [Logs].[LogNUser] = [Users].[NUser] WHERE ([LogTimestamp] BETWEEN @DateFrom AND @DateTo) ) AS [TempTable] WHERE ([RowNumber] BETWEEN @RecordFrom AND @RecordTo)
Переменные @RecordFrom и @RecordTo используются для пейджинга (аналог LIMIT), а поле [TotalRows] будет содержать общее количество записей (аналог SQL_CALC_FOUND_ROWS).
P.S. Ещё один вариант с использованием CTE (Common Table Expressions) нашелся здесь.
