Veamos, si el concepto es devolver un cierto numero de registros a tu "cliente" que no esten tomados por otro "cliente" (me suena a tipo operadores), entonces ya lo hemos tratado aca y se hace mediante un campo tipo bandera (tal vez con el numero del id del que toma los registros). Creo que por este lado, no debe haber duda.
Paginar:
Código SQL:
Ver originalCREATE PROCEDURE #Paginacion
@Apellido VARCHAR(40) = NULL OUTPUT, @Nombre VARCHAR(40) = NULL OUTPUT
AS
SET NOCOUNT ON
-- Seleccione las proximas 5 filas
SELECT TOP 2 WITH TIES *
FROM #test
WHERE CASE WHEN @Apellido IS NULL THEN 1
WHEN @Apellido + @Nombre < apellido + nombre THEN 1 ELSE 0 END=1
ORDER BY apellido, nombre
-- Seleccione el siguiente apellido
SELECT @Apellido = MAX(apellido),
@Nombre = MAX(nombre)
FROM ( SELECT TOP 2 apellido, nombre
FROM #test
WHERE CASE WHEN @Apellido IS NULL THEN 1
WHEN @Apellido + @Nombre < apellido + nombre THEN 1 ELSE 0 END=1
ORDER BY apellido, nombre) AS N
GO
/* Fin de Declaracion de Procedimiento */
/* Uso de Procedimiento */
DECLARE @UltimoApellido VARCHAR(40), @UltimoNombre VARCHAR (40)
EXEC #Paginacion @UltimoApellido OUTPUT, @UltimoNombre OUTPUT
EXEC #Paginacion @UltimoApellido OUTPUT, @UltimoNombre OUTPUT
EXEC #Paginacion @UltimoApellido OUTPUT, @UltimoNombre OUTPUT
/* Fin de Procedimiento */
A este query, solo le hace falta agregar en el filtro del WHERE, aquellos que esten "libres", que no esten tomados por otro "cliente".