Если у вас есть какой-нибудь способ, чтобы гарантировать последовательный порядок результатов я не могу понять, почему вы не можете использовать row_number с общим выражением таблицы, как это:
;WITH CTE AS
(
SELECT *, ROW_NUMBER() OVER(ORDER BY something_unique DESC) AS 'Row'
FROM my_table
)
-- To get the first 50k rows:
SELECT * FROM CTE WHERE Row BETWEEN 0 AND 50000
-- To get the next 50k rows:
--SELECT * FROM CTE WHERE Row BETWEEN 50001 AND 100000
Это не очень эффективно, хотя, как вы строите номер строки по всей таблице, хотя вам нужно всего лишь 50 тыс. Если возможно, вам может потребоваться добавить дополнительный столбец в исходную таблицу, чтобы включить некоторые искусственные цифры.
Как указано в комментариях, только с использованием TOP X без заказа результатов сначала будут отображаться несогласованные результаты, так как заказ не гарантируется, если явно не указано.
Если вы выбрали 'top 50000' без' ORDER BY' на каком-то столбце (например, 'id', который, как вы говорите, отсутствуют), тогда нет никакой гарантии, что даже повторное выполнение * тот же * запрос вернет * то же самое 50000 строк, не говоря уже о любом способе гарантировать возможность получения «следующего» 50000. –