MS SQL Server не так уж и часто применяется для веб-проектов (особенно, версия 2005), тем не менее, когда дело доходит до написания запросов к базе данных, программист, привыкший работать с MySQL иногда сталкивается с препятствиями. 

Недавно мне довелось писать на PHP веб-интерфейс к довольно древней базе данных, работающей под Microsoft SQL Server 2005 и я столкнулся с одной проблемой - MS SQL 2005 не поддерживает выражение LIMIT в запросе на выборку и это здорово осложнило задачу в формировании постраничной навигации. Напомню, что в MySQL выборка ограниченного количества со смещением относительно начала выборки элементов делалось примерно таким запросом:

SELECT * FROM `TABLE` WHERE 1 LIMIT 5,10

Этот запрос выбирает 10 элементов, начиная с 6-го по счету. Этот прием незаменим, если нужно организовать, скажем, постраничную навигацию, чтобы на странице выводились по 10 элементов, а не сразу все (их может быть 100,1000,10000000).

Как сделать такую же операцию в MS SQL 2005? В новых версиях сервера (насколько я знаю, начиная с 2011) есть поддержка выражения LIMIT и SKIP но как быть, если вы вынуждены подружить свой скрипт с более древней версией?

Я искал решение довольно долго, были разные варианты один страшнее другого - вплоть до написания процедур, слава богу, нашлось более компактное решение - вот оно:

SELECT TOP 10 * FROM [TABLE]
WHERE id NOT IN (SELECT TOP 5 id FROM [TABLE] ORDER BY id) ORDER BY id

Грубо говоря, выбираем первые элементов, которые не входят в первую пятерку. Метод, конечно, через пень-колоду, но он работает! Если у вас есть какой-то свой метод - поделитесь им в комментариях :)