PDA

View Full Version : Phân trang trong MS SQL



rock4ever
26-06-2006, 03:10
Hello all,

Cho mình hỏi tý về cách phân trang trong MS SQL

Ví dụ mình có 1 bảng tblTemp có 1 triệu record. Mình muốn phân trang ngay trên câu lệnh SQL luôn.

Ví dụ đối với MySQL thì để phân trang trong cầu SELECT thì dùng LIMIT start,end. Vd : SELECT * FROM tblTemp LIMIT 0, 10 (--> nghĩa là lấy 10 record đầu sau khi select *)

SELECT * FROM tblTemp LIMIT 20,10 (--> nghĩa lấy từ record 20 -> record 29 sau khi select *)

Điều này rất lợi cho phân trang nếu bảng có CSDL lớn (database server chỉ trả về đúng số record mong muốn chứ không trả về đủ 1 triệu records rồi trên application server mới phân trang).

Trong MS SQL 2000 thì làm thế nào vậy mấy bro, mình tìm hiểu nhưng chưa thấy ? Giúp mình với.

Thanks !!

lannguyen
26-06-2006, 06:50
Ví dụ sau test với database pubs có sẵn của MSSQL 2000:
SELECT emp_id, lname, fname FROM employee LIMIT 20,10
tương đương với
SELECT * from (
select top 10 emp_id,lname,fname from (
select top 30 emp_id,lname,fname
from employee
order by lname asc
) as newtbl order by lname desc
) as newtbl2 order by lname asc

namtuocbongtoi
03-07-2006, 15:35
vậy nếu dùng
select top 10 * from table where id not IN (select top 20 id from table order by id) order by id
cái nào tốt hơn?

nminhkha
13-07-2006, 16:26
Bạn tham khảo ở đây nè, có nhận xét đầy dủ9 luôn :http://www.codeproject.com/aspnet/PagingLarge.asp

tieuvitco
28-07-2006, 16:43
==>> select top 10 * from table where id not IN (select top 20 id from table order by id) order by id

tieuvitco thấy cách này không ổn lắm, ảnh hưởng đến tốc độ của chương trình ghê quá, nếu khi số lượng dòng lên đến vài triệu thì chắc MS SQL làm việc bở hơi tai...

MichaelTuanAnh
28-08-2006, 09:04
Đúng rồi, nếu dùng truy vấn lồng trong trường hợp này quả là không ổn, phải tìm giải pháp khác

RoboNet
28-08-2006, 09:17
CREATE PROCEDURE GetDocuments
@PageSize int,
@PageNumber int
AS
DECLARE @Ignore int
DECLARE @LastID int

IF @PageNumber > 1
BEGIN
/* For pages > 1 compute how many records to ignore,
set ROWCOUNT and SELECT ID into @LastID */
SET @Ignore = @PageSize * (@PageNumber - 1)
SET ROWCOUNT @Ignore
SELECT @LastID = ID
FROM Documents
ORDER BY ID DESC
END
ELSE
BEGIN
/* For page #1 just set rowcount to pagesize */
SET ROWCOUNT @PageSize
END

/* Set rowcount to @PageSize and
SELECT page for output (note the WHERE clause) */
SET ROWCOUNT @PageSize
SELECT *
FROM Documents
WHERE ID < @LastID
ORDER BY ID DESC
SET ROWCOUNT 0
GO