Có nhiều cách để triển khai STORED PROCEDURE
mà bạn cần. Ví dụ:bạn có thể sử dụng ROW_NUMBER
xây dựng bên trong câu lệnh SQL CTE.
Nếu bạn sử dụng SQL Server 2012, bạn có thể sử dụng OFFSET
và FETCH
sau ORDER BY
để triển khai phân trang (xem tại đây
). Trong trường hợp, câu lệnh SQL trông rất gần với câu lệnh MySQL hoặc PostgreSQL tương ứng sử dụng OFFSET
và LIMIT
. Nhân tiện, Microsoft Entity Framework sử dụng Ngôn ngữ SQL của Thực thể
có cấu trúc gần (SKIP
và LIMIT
). Có thể là OFFSET
và FETCH
sẽ được ưu tiên hơn nếu bạn sử dụng SQL Server 2012 trở lên.
Bởi vì bạn đã bao gồm thẻ SQL Server 2008 trong câu hỏi của mình, tôi sẽ không sử dụng cấu trúc SQL Server 2012 mới trong câu trả lời của mình.
Một cách hay nữa là sử dụng sp_executesql
cho phép bạn xây dựng một câu lệnh SQL dưới dạng chuỗi với các tham số. Nó cho phép sử dụng lại các kế hoạch thực thi, điều này rất quan trọng để có hiệu suất tốt nhất. Phương pháp này cho phép bạn mở rộng mã của STORED PROCEDURE
của bạn để triển khai lọc phía máy chủ (tìm kiếm).
Tôi thấy rằng cần phải triển khai phân trang trong câu lệnh SQL chứa ID của dữ liệu trả về (PersonId
trong trường hợp của bạn). Vì vậy, tôi quyết định đề nghị bạn sử dụng cách đơn giản hóa sử dụng SELECT TOP
kết hợp với LEFT OUTER JOIN
.
Bạn STORED PROCEDURE
dbo.GetExtraPerson
có thể có thêm hai tham số kiểu int
:@skip
và @pageSize
. Trong trường hợp của @skip
bằng 0
STORED PROCEDURE
chỉ có thể thực thi
SELECT TOP (@pageSize) PERS.PersonId
,PERS.FirstName
,PERS.LastName
,PERS.MobileNumber
,PERS.EmailId
,PERS.PersonNumber
,E.ExtraPersonId
,E.Diabetes
,E.BloodPressure
FROM ExtraPerson E
INNER JOIN Person PERS ON PERS.PersonId=E.PersonId
WHERE [email protected] AND [email protected] AND E.IsDeleted=0
Nếu @skip
không bằng 0
thì câu lệnh SQL tương ứng có thể như sau
WITH GetAll AS (
SELECT PERS.PersonId
,PERS.FirstName
,PERS.LastName
,PERS.MobileNumber
,PERS.EmailId
,PERS.PersonNumber
,E.ExtraPersonId
,E.Diabetes
,E.BloodPressure
FROM ExtraPerson E
INNER JOIN Person PERS ON PERS.PersonId=E.PersonId
WHERE [email protected] AND [email protected] AND E.IsDeleted=0
),GetFirst AS (
SELECT TOP (@skip) *
FROM GetAll
ORDER BY Name
),GetNext AS (
SELECT TOP (@pageSize) a.*
FROM GetAll AS a
LEFT OUTER JOIN GetFirst AS f ON f.Id=a.Id
WHERE f.Id IS NULL
ORDER BY Name
)
SELECT * FROM GetNext
Mã đầy đủ của dbo.GetExtraPerson
có thể là về những điều sau
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE dbo.GetExtraPerson
@CampId int,
@ReferencePatientId bigint,
@skip int,
@pageSize int
AS
BEGIN
DECLARE @records int;
SET NOCOUNT ON;
SET @records = (SELECT COUNT(*)
FROM ExtraPerson E
INNER JOIN Person PERS ON PERS.PersonId=E.PersonId
WHERE [email protected]
AND [email protected]
AND E.IsDeleted=0);
IF @skip <= 0
SELECT TOP (@pageSize) PERS.PersonId
,PERS.FirstName
,PERS.LastName
,PERS.MobileNumber
,PERS.EmailId
,PERS.PersonNumber
,E.ExtraPersonId
,E.Diabetes
,E.BloodPressure
FROM ExtraPerson E
INNER JOIN Person PERS ON PERS.PersonId=E.PersonId
WHERE [email protected] AND [email protected]
AND E.IsDeleted=0
ELSE
WITH GetAll AS (
SELECT PERS.PersonId
,PERS.FirstName
,PERS.LastName
,PERS.MobileNumber
,PERS.EmailId
,PERS.PersonNumber
,E.ExtraPersonId
,E.Diabetes
,E.BloodPressure
FROM ExtraPerson E
INNER JOIN Person PERS ON PERS.PersonId=E.PersonId
WHERE [email protected] AND [email protected]
AND E.IsDeleted=0
),GetFirst AS (
SELECT TOP (@skip) *
FROM GetAll
ORDER BY Name
),GetNext AS (
SELECT TOP (@pageSize) a.*
FROM GetAll AS a
LEFT OUTER JOIN GetFirst AS f ON f.Id=a.Id
WHERE f.Id IS NULL
ORDER BY Name
)
SELECT * FROM GetNext;
RETURN @records;
END
GO
Quy trình trên trả về tổng số bản ghi và bạn có thể sử dụng nó để gán totalRecords
giá trị.
Nếu bạn sử dụng mã trên kết hợp với sp_executesql
bạn có thể dễ dàng sửa đổi mã để bao gồm ORDER BY
trong tất cả SELECT TOP
sao cho các giá trị trả về sẽ tương ứng với thứ tự sắp xếp do người dùng yêu cầu trong jqGrid.