использовать row_number
пример
вызов 1
;WITH cte AS(SELECT *,row_number() OVER( ORDER BY name) AS rows FROM sysobjects)
SELECT * FROM cte WHERE ROWS BETWEEN 1 AND 8
ORDER BY rows
звонок 2
;WITH cte AS(SELECT *,row_number() OVER( ORDER BY name) AS rows FROM sysobjects)
SELECT * FROM cte WHERE ROWS BETWEEN 9 AND 16
ORDER BY rows
Конечно, вы хотите использовать параметры вместо жесткого кодирования чисел. Таким образом, вы можете использовать запрос повторно, если столбец можно отсортировать произвольно, тогда вам может потребоваться использовать динамический SQL
edit, вот как это должно выглядеть, вы, вероятно, также хотите вернуть максимальное количество строк, чтобы вы знали, сколько строк может быть потенциально возвращено
также вы можете сделать строки на странице динамическими, в этом случае это будет что-то вроде
где строки между @StartRow и (@StartRow + @RowsPerPage) -1
обязательно прочитайте Условия динамического поиска в версии T-SQL для SQL 2008 , чтобы увидеть, как можно оптимизировать это, чтобы получить повторное использование плана и лучший план в целом
В любом случае, вот процедура, конечно, не проверенная, поскольку я не могу запустить ее здесь
DECLARE @StartRow INT,@EndRow INT
--SELECT @StartRow =1, @EndRow = 8
;WITH cte AS (SELECT ROW_NUMBER() OVER (ORDER BY
CASE WHEN @sort = 'votes1' THEN m.votes END DESC,
CASE WHEN @sort = 'votes2' THEN m.votes END ASC,
CASE WHEN @sort = 'age1' THEN datediff(hour,m.timestamp, getdate()) END ASC,
CASE WHEN @sort = 'age2' THEN datediff(hour,m.timestamp, getdate()) END DESC,
CASE WHEN @sort = 'distance1' THEN (geography::Point(@latitude, @longitude, 4326).STDistance(m.point)) * 0.000621371192237334 END ASC,
CASE WHEN @sort = 'distance2' THEN (geography::Point(@latitude, @longitude, 4326).STDistance(m.point)) * 0.000621371192237334 END DESC
END) AS rows
m.message,
m.votes,
(geography::Point(@latitude, @longitude, 4326).STDistance(m.point)) * 0.000621371192237334 as distance,
m.location,
datediff(hour,m.timestamp, getdate()) as age,
m.messageId,
ml.voted,
ml.flagged
FROM
tblMessages m
left join tblIPMessageLink ml on m.messageid = ml.messageid
WHERE
m.timestamp >= DATEADD(day, DATEDIFF(day, 0, @date), 0)
and
m.timestamp < DATEADD(day, DATEDIFF(day, 0, @date), 1)
)
SELECT *
FROM cte WHERE ROWS BETWEEN @StartRow AND @EndRow
ORDER BY rows