sql >> Base de Datos >  >> RDS >> Sqlserver

Implementación de paginación usando OFFSET FETCH NEXT en SQL Server

Una base de datos puede tener cientos de miles de registros. Es fácil insertar y seleccionar estos registros a través de sistemas de administración de bases de datos como SQL Server o MySQL, etc. Sin embargo, no es fácil mostrar miles de registros en una sola página web o en una aplicación de escritorio. Las limitaciones de espacio y memoria dificultan la visualización de una gran cantidad de registros a la vez.

Una solución común a este problema es implementar la paginación. (Tenga en cuenta que esto no es paginación de memoria implementada por los sistemas operativos) La paginación en la programación se refiere a mostrar datos a través de una serie de páginas. Una búsqueda aleatoria en Google puede generar miles de resultados. Google utiliza paginación para mostrar estos resultados. Si se desplaza hacia abajo en la página de Google con los resultados de búsqueda, verá lo siguiente:

Aquí puede ver el número de páginas en las que se divide el resultado de la búsqueda. Puede hacer clic en el enlace Siguiente para ver más páginas.

En este artículo, veremos cómo se pueden usar los operadores OFFSET FETCH NEXT para implementar la paginación en aplicaciones front-end. Comenzaremos con un ejemplo simple usando el operador OFFSET FETCH NEXT y luego veremos cómo se puede usar en la práctica con la ayuda de un procedimiento almacenado.

Uso de OFFSET FETCH NEXT para paginación en SQL Server

SQL Server contiene los operadores OFFSET y NEXT para implementar la paginación. El operador OFFSET compensa el siguiente número K de resultados de búsqueda desde el principio, mientras que el operador FETCH NEXT obtiene los NEXT N resultados donde K y N son números enteros.

Preparación de datos ficticios

Antes de que podamos ver OFFSET FETCH NEXT en acción, creemos una base de datos ficticia con 200 registros. Puede usar una base de datos en funcionamiento si está 100% seguro de que tiene una copia de seguridad adecuada. Ejecute el siguiente script para hacerlo:

CREATE Database ShowRoom;
GO
USE ShowRoom;

CREATE TABLE Cars
(
id INT PRIMARY KEY IDENTITY,
name VARCHAR(50) NOT NULL,
company VARCHAR(50) NOT NULL,
power INT NOT NULL
)

En el script anterior, creamos una base de datos ficticia ShowRoom con una tabla llamada Cars. Agreguemos algunos registros ficticios en esta base de datos. Ejecute el siguiente script:

 USE ShowRoom
DECLARE @count INT
SET @count = 1

DECLARE @carname VARCHAR (50)
DECLARE @company_name VARCHAR (50)

 WHILE (@count <= 200)
 BEGIN
	  SET @carname = 'Car - ' + LTRIM(@count)
	  SET @company_name = 'Company - '+ LTRIM(@count)
	  INSERT INTO Cars VALUES (@carname, @company_name, @count * 5)
	  SET @count = @count + 1
END

Tome una mirada cuidadosa a la secuencia de comandos anterior. El script anterior inserta 200 registros ficticios en la tabla Cars. El script usa un ciclo while para 200 iteraciones. Cada iteración agrega la palabra 'Car -' al número de iteración y el resultado se inserta en la columna de nombre de la tabla Cars. De manera similar, la palabra "Empresa -" se adjunta con el número de iteración y se inserta en la columna de la empresa en cada iteración. Finalmente, con cada iteración, el número de iteración se multiplica por 5 y el resultado se inserta en la columna de potencia. Ahora, si selecciona todos los registros de la tabla Cars, verá 200 registros en el conjunto de resultados. Ejecute la siguiente consulta para hacerlo:

SELECT * FROM Cars

La captura de pantalla del resultado parcial de la consulta anterior es la siguiente. Puede ver 200 filas en el resultado.

Ejemplo de DESPLAZAMIENTO FETCH SIGUIENTE

Ahora veamos OFFSET NEXT en acción. La sintaxis de OFFSET NEXT es la siguiente:

SELECT * FROM Table_Name
ORDER BY COLUMN_NAME/S
OFFSET Number_of_rows_to_Skip ROWS
FETCH NEXT Number_of_rows_to_Fetch ROWS ONLY

Es importante mencionar aquí que debe usar la cláusula ORDER BY con las cláusulas OFFSET FETCH NEXT.

Veamos un ejemplo simple de OFFSET FETCH NEXT donde ordenaremos los datos por la columna id de la tabla Cars, omitiremos las primeras 20 filas y buscaremos las siguientes 10 filas. Ejecute el siguiente script:

USE ShowRoom
SELECT * FROM Cars
ORDER BY id
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY

En el resultado de la secuencia de comandos anterior, verá registros con un valor de identificación de 21 a 30, ya que omitimos los primeros 20 registros y recuperamos los siguientes 10.

Uso de OFFSET FETCH NEXT con procedimiento almacenado

Si está implementando la paginación en una aplicación front-end, como un sitio web o una aplicación de escritorio, normalmente enviará los valores de número de página y tamaño de página al servidor a través de un procedimiento almacenado. Según el valor del número de página y el tamaño de página, el procedimiento almacenado devolverá el conjunto correcto de filas. Escribamos un procedimiento almacenado que tome el número de página y el tamaño de página como parámetros y devuelva los registros correspondientes.

Echa un vistazo a la siguiente secuencia de comandos:

USE ShowRoom
GO
CREATE PROC spGetRecordsByPageAndSize
@Page INT,
@Size INT
AS
BEGIN
	SELECT * FROM Cars
	ORDER BY id
	OFFSET (@Page -1) * @Size ROWS
	FETCH NEXT @Size ROWS ONLY
END

En el script anterior, creamos un procedimiento almacenado spGetRecordsByPageAndSize que toma 2 parámetros @Page y @Size. El procedimiento almacenado utiliza OFFSET FETCH NEXT para filtrar registros por número de páginas y tamaño de página. Por ejemplo, si el número de página es 2 y el tamaño es 20, el DESPLAZAMIENTO será:

(2 – 1) * 20 =20

Y el valor para FETCH next será igual a @Size, es decir, 20. Por lo tanto, se devolverán los registros con id 21 a 40. Ejecute el script anterior para crear un procedimiento almacenado.
Una vez que haya creado el procedimiento almacenado, ejecute el siguiente script para ver qué se devuelve cuando el número de página es 2 y el tamaño de página es 20.

EXECUTE spGetRecordsByPageAndSize 2, 20

El resultado del script anterior se ve así:

De manera similar, si desea recuperar registros para la cuarta página con 15 registros por página, la siguiente consulta recupera los registros de id 46 a id 60.

EXECUTE spGetRecordsByPageAndSize 4, 15

La salida de se ve así:

Conclusión

OFFSET FETCH NEXT es una herramienta extremadamente útil, especialmente si desea mostrar una gran cantidad de registros agrupados en páginas. En este artículo, vimos cómo se usa junto con un procedimiento almacenado para implementar la paginación en aplicaciones front-end.