Вам не нужно иметь уникальный идентификатор, если вы знаете хотя бы одно имя столбца, по которому вы можете заказать.
declare @tbl_test table(
first_name nvarchar(255),
last_name nvarchar(255),
[address] nvarchar(255)
);
insert @tbl_test values ('Andrei','Corovei','str Meteor');
insert @tbl_test values ('Pop','Ionut','str Meteor');
insert @tbl_test values ('Whitehead','John','str Lunii');
insert @tbl_test values ('Grisham','Robert','str Corcoduselor');
insert @tbl_test values ('Eugen','Johnesco','str Prunelor');
select
*
from
(select
row_number() over (partition by r%2 order by first_name) as batch,
*
from
(select
row_number() over (order by first_name) as r,
*
from
@tbl_test
) as t
) as b
where
batch = 2
order by
batch, r
;
Результатом этого является то, что вы видите только те строки, которые входят в партию 2. Простой цикл вокруг этого, который увеличивает номер партии, будет получать по одной партии за раз; просто перестаньте зацикливаться, когда больше нет партий.
Единственная проблема заключается в том, что количество строк в вашей таблице изменяется во время обработки.