Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Triển khai phân trang bằng cách sử dụng OFFSET FETCH NEXT trong SQL Server

Một cơ sở dữ liệu có thể có hàng trăm nghìn bản ghi. Có thể dễ dàng chèn và chọn các bản ghi này thông qua các hệ quản trị cơ sở dữ liệu như SQL Server hoặc MySQL, v.v ... Tuy nhiên, việc hiển thị hàng nghìn bản ghi trên một trang web hoặc trong một ứng dụng máy tính để bàn không phải là điều dễ dàng. Hạn chế về dung lượng và bộ nhớ khiến việc hiển thị một số lượng lớn các bản ghi cùng một lúc rất khó khăn.

Một giải pháp phổ biến cho một vấn đề như vậy là thực hiện phân trang. (Lưu ý, đây không phải là phân trang bộ nhớ được thực hiện bởi hệ điều hành) Phân trang trong lập trình đề cập đến việc hiển thị dữ liệu qua một loạt các trang. Một tìm kiếm ngẫu nhiên của Google có thể dẫn đến hàng nghìn kết quả. Google sử dụng phân trang để hiển thị các kết quả này. Nếu bạn cuộn xuống trang Google với kết quả tìm kiếm, bạn sẽ thấy như sau:

Tại đây bạn có thể thấy số lượng trang mà kết quả tìm kiếm được chia thành. Bạn có thể nhấp vào liên kết Tiếp theo để xem các trang khác.

Trong bài viết này, chúng ta sẽ xem cách các toán tử OFFSET FETCH NEXT có thể được sử dụng để thực hiện phân trang trên các ứng dụng front-end. Chúng ta sẽ bắt đầu với một ví dụ đơn giản bằng cách sử dụng toán tử OFFSET FETCH NEXT và sau đó sẽ xem nó có thể được sử dụng thực tế như thế nào với sự trợ giúp của một thủ tục được lưu trữ.

Sử dụng OFFSET FETCH NEXT để phân trang trong SQL Server

SQL Server chứa các toán tử OFFSET &NEXT để triển khai phân trang. Toán tử OFFSET lấy đi K số kết quả tìm kiếm tiếp theo từ đầu, trong khi toán tử FETCH NEXT lấy kết quả NEXT N trong đó K và N là các số nguyên.

Chuẩn bị dữ liệu giả

Trước khi chúng ta có thể thấy OFFSET FETCH NEXT hoạt động, hãy tạo một cơ sở dữ liệu giả với 200 bản ghi. Bạn có thể sử dụng cơ sở dữ liệu đang hoạt động nếu bạn chắc chắn 100% rằng nó được sao lưu đúng cách. Thực thi tập lệnh sau để làm như vậy:

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
)

Trong đoạn script trên, chúng ta tạo một cơ sở dữ liệu giả ShowRoom với một bảng có tên là Cars. Hãy thêm một số bản ghi giả vào cơ sở dữ liệu này. Thực thi tập lệnh sau:

 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

Hãy xem kỹ đoạn script trên. Tập lệnh trên chèn 200 bản ghi giả vào bảng Cars. Tập lệnh sử dụng một vòng lặp while cho 200 lần lặp. Mỗi lần lặp sẽ thêm từ ‘Xe -’ vào số lần lặp và kết quả được chèn vào cột tên của bảng Ô tô. Tương tự, từ “Công ty -” được thêm vào với số lần lặp và được chèn vào cột công ty trong mỗi lần lặp. Cuối cùng, với mỗi lần lặp, số lần lặp được nhân với 5 và kết quả được chèn vào cột lũy thừa. Bây giờ nếu bạn chọn tất cả các bản ghi từ bảng Cars, bạn sẽ thấy 200 bản ghi trong tập kết quả. Thực thi truy vấn sau để làm như vậy:

SELECT * FROM Cars

Ảnh chụp màn hình kết quả một phần của truy vấn trên như sau. Bạn có thể thấy 200 hàng trong kết quả.

Ví dụ OFFSET FETCH NEXT

Bây giờ, hãy xem hành động của OFFSET NEXT. Cú pháp của OFFSET NEXT như sau:

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

Điều quan trọng cần đề cập ở đây là bạn phải sử dụng mệnh đề ORDER BY với mệnh đề OFFSET FETCH NEXT.

Hãy xem một ví dụ đơn giản về OFFSET FETCH NEXT trong đó chúng ta sẽ sắp xếp dữ liệu theo cột id của bảng Cars, bỏ qua 20 hàng đầu tiên và tìm nạp 10 hàng tiếp theo. Thực thi tập lệnh sau:

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

Trong đầu ra của tập lệnh ở trên, bạn sẽ thấy các bản ghi có giá trị id từ 21 đến 30 vì chúng tôi đã bỏ qua 20 bản ghi đầu tiên và tìm nạp 10 bản tiếp theo.

Sử dụng OFFSET FETCH NEXT với quy trình được lưu trữ

Nếu bạn đang triển khai phân trang trong ứng dụng giao diện người dùng, chẳng hạn như trang web hoặc ứng dụng dành cho máy tính để bàn, bạn thường sẽ gửi các giá trị số trang và kích thước trang đến máy chủ thông qua một thủ tục được lưu trữ. Tùy thuộc vào giá trị của số trang và kích thước trang, thủ tục được lưu trữ sẽ trả về tập hợp các hàng chính xác. Hãy viết một quy trình được lưu trữ như vậy, lấy số trang và kích thước trang làm tham số và trả về các bản ghi tương ứng.

Hãy xem tập lệnh sau:

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

Trong đoạn script trên, chúng ta tạo một thủ tục được lưu trữ spGetRecordsByPageAndSize có 2 tham số @Page và @Size. Thủ tục được lưu trữ sử dụng OFFSET FETCH NEXT để lọc các bản ghi theo một số trang và kích thước trang. Ví dụ:nếu số trang là 2 và kích thước là 20, OFFSET sẽ là:

(2 - 1) * 20 =20

Và giá trị cho FETCH tiếp theo sẽ bằng @Size, tức là 20. Do đó, các bản ghi có id từ 21 đến 40 sẽ được trả về. Thực thi tập lệnh trên để tạo một thủ tục được lưu trữ.
Sau khi bạn đã tạo thủ tục được lưu trữ, hãy thực thi tập lệnh sau để xem những gì được trả về khi số trang là 2 và kích thước trang là 20.

EXECUTE spGetRecordsByPageAndSize 2, 20

Đầu ra của tập lệnh trên trông giống như sau:

Tương tự, nếu bạn muốn truy xuất các bản ghi cho trang thứ 4 với 15 bản ghi trên mỗi trang, truy vấn sau sẽ truy xuất các bản ghi từ id 46 đến id 60.

EXECUTE spGetRecordsByPageAndSize 4, 15

Đầu ra của có dạng như sau:

Kết luận

OFFSET FETCH NEXT là một công cụ cực kỳ hữu ích, đặc biệt nếu bạn muốn hiển thị một số lượng lớn các bản ghi được nhóm thành các trang. Trong bài viết này, chúng tôi đã biết cách nó được sử dụng cùng với một thủ tục được lưu trữ để triển khai phân trang trên các ứng dụng front-end.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cập nhật dữ liệu thông qua một hàm có giá trị bảng trong SQL Server

  2. Tách chuỗi được phân cách bằng dấu phẩy và chèn vào bảng (int)

  3. Làm cách nào để xuất dữ liệu ở định dạng CSV từ SQL Server bằng sqlcmd?

  4. Cách tạo Ràng buộc Kiểm tra trên Cột Đơn trong SQL Server - Hướng dẫn SQL Server / TSQL Phần 83

  5. Giới thiệu về Storage Spaces Direct cho SQL Server