Ada banyak cara untuk menerapkan STORED PROCEDURE
yang Anda butuhkan. Misalnya Anda dapat menggunakan ROW_NUMBER
konstruksi di dalam pernyataan CTE SQL.
Jika Anda menggunakan SQL Server 2012 Anda dapat menggunakan OFFSET
dan FETCH
setelah ORDER BY
untuk menerapkan pagination (lihat di sini
). Jika pernyataan SQL akan terlihat sangat dekat dengan pernyataan MySQL atau PostgreSQL yang sesuai yang menggunakan OFFSET
dan LIMIT
. Omong-omong Microsoft Entity Framework menggunakan Bahasa SQL Entitas
memiliki konstruksi yang dekat (SKIP
dan LIMIT
). Mungkin OFFSET
dan FETCH
akan lebih disukai jika Anda menggunakan SQL Server 2012 atau lebih tinggi.
Karena Anda menyertakan tag SQL Server 2008 dalam pertanyaan Anda, saya tidak akan menggunakan konstruksi SQL Server 2012 baru dalam jawaban saya.
Satu lagi cara yang baik adalah dengan menggunakan sp_executesql
yang memungkinkan Anda membuat pernyataan SQL sebagai string dengan parameter. Hal ini memungkinkan untuk menggunakan kembali rencana eksekusi yang sangat penting untuk kinerja terbaik. Pendekatan ini memungkinkan Anda untuk memperluas kode STORED PROCEDURE
untuk menerapkan pemfilteran sisi server (pencarian).
Saya melihat kebutuhan untuk mengimplementasikan pagination dalam pernyataan SQL yang berisi ID dari data yang dikembalikan (PersonId
dalam kasus Anda). Jadi saya memutuskan untuk menyarankan Anda untuk menggunakan cara yang disederhanakan yang menggunakan SELECT TOP
dalam kombinasi dengan LEFT OUTER JOIN
.
Anda STORED PROCEDURE
dbo.GetExtraPerson
dapat memiliki dua parameter tambahan bertipe int
:@skip
dan @pageSize
. Dalam kasus @skip
sama dengan 0
STORED PROCEDURE
hanya bisa mengeksekusi
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
Jika @skip
tidak sama dengan 0
maka pernyataan SQL yang sesuai dapat menjadi sebagai berikut
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
Kode lengkap dbo.GetExtraPerson
bisa tentang berikut
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
Prosedur di atas mengembalikan jumlah total catatan tambahan dan Anda dapat menggunakannya untuk menetapkan totalRecords
nilai.
Jika Anda akan menggunakan kode di atas dalam kombinasi dengan sp_executesql
Anda dapat dengan mudah memodifikasi kode untuk memasukkan ORDER BY
di semua SELECT TOP
pernyataan sehingga nilai yang dikembalikan akan sesuai dengan urutan pengurutan yang diminta oleh pengguna di jqGrid.