Tuesday , 19 March 2024
HOT

Phân trang trong sql server

QL Server 2005 có một chức năng ROW_NUMBER có thể giúp với hồ sơ phân trang cho các bạn các ứng dụng cơ sở dữ liệu. ROW_NUMBER trả về một số tuần tự, bắt đầu từ 1, cho mỗi hàng trả lại trong một tập kết quả.

Nếu muốn trang đầu tiên hiện10 bản ghii được sắp xếp theo Ngày DESC,có thể sử dụng chức ROW_NUMBER như sau:

SELECT Description, Date
FROM (SELECT ROW_NUMBER() OVER (ORDER BY Date DESC)
AS Row, Description, Date FROM LOG)
AS LogWithRowNumbers
WHERE Row >= 1 AND Row <= 10

Trang thứ hai của bản ghi thứ 10 sau đó sẽ được như sau:

SELECT Description, Date
FROM (SELECT ROW_NUMBER() OVER (ORDER BY Date DESC)
AS Row, Description, Date FROM LOG)
AS LogWithRowNumbers
WHERE Row >= 11 AND Row <= 20

Nếu bạn có rất nhiều bản ghi, sử dụng TOP X trong mệnh đề SELECT bên trong có thể tăng tốc độ một chút như không có sử dụng trở lại 1.000 bản ghi nếu bạn chỉ đi để lấy bản ghi từ 11 đến 20:

SELECT Description, Date
FROM (SELECT TOP 20 ROW_NUMBER() OVER (ORDER BY Date DESC)
AS Row, Description, Date FROM LOG)
AS LogWithRowNumbers
WHERE Row >= 11 AND Row <= 20

Và Store

CREATE PROCEDURE dbo.ShowLog
@PageIndex INT,
@PageSize INT
AS

BEGIN

WITH LogEntries AS (
SELECT ROW_NUMBER() OVER (ORDER BY Date DESC)
AS Row, Date, Description
FROM LOG)

SELECT Date, Description
FROM LogEntries
WHERE Row between

(@PageIndex – 1) * @PageSize + 1 and @PageIndex*@PageSize

One comment

  1. Cảm ơn bạn nhiều, mình đã học được nhiều từ các bài viết của bạn.

    bạn có thể sử dụng offset trong SQL server, như vậy đơn giản hơn trong việc viết code mà chạy cũng nhanh hơn.
    VD :
    SELECT * FROM dbo.Tinh — bình thường
    SELECT * FROM dbo.Tinh ORDER BY TinhID OFFSET 5 ROWS FETCH NEXT 10 ROW ONLY — sử dụng offset.
    Có một vấn đề là offset yêu cầu phải có order by.

Leave a Reply

Your email address will not be published. Required fields are marked *

*