LIMIT и SQL_CALC_FOUND_ROWS для MS SQL Server

23.05.2010 21:10 / Артём Волк / 1512 просмотров / ...

В MySQL есть несколько полезных дополнений к стандартному SQL:

Обычно, обе эти возможности используются одновременно.

В 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) нашелся здесь.