Der er mange måder at implementere STORED PROCEDURE på som du har brug for. For eksempel kan du bruge ROW_NUMBER konstruktion inde i CTE SQL-sætning.
Hvis du bruger SQL Server 2012, kan du bruge OFFSET og FETCH efter ORDER BY for at implementere paginering (se her
). I det tilfælde vil SQL-sætningen se meget tæt på de tilsvarende MySQL- eller PostgreSQL-sætninger, som bruger OFFSET og LIMIT . Microsoft Entity Framework bruger i øvrigt Entity SQL Language
med tæt konstruktion (SKIP og LIMIT ). Sandsynligvis OFFSET og FETCH ville være den foretrukne måde, hvis du bruger SQL Server 2012 eller højere.
Fordi du inkluderede SQL Server 2008-tag i dit spørgsmål, ville jeg ikke bruge nye SQL Server 2012-konstruktioner i mit svar.
En anden god måde ville være at bruge sp_executesql som giver dig mulighed for at konstruere en SQL-sætning som streng med parametre. Det giver mulighed for at genbruge eksekveringsplaner, hvilket er meget vigtigt for den bedste ydeevne. Fremgangsmåden giver dig mulighed for at udvide koden for din STORED PROCEDURE at implementere serversidefiltrering (søgning).
Jeg ser, at det er nødvendigt at implementere paginering i SQL-sætningen, som indeholder ID for de returnerede data (PersonId i dit tilfælde). Så jeg beslutter mig for at foreslå dig at bruge en forenklet måde som bruger SELECT TOP i kombination med LEFT OUTER JOIN .
Du STORED PROCEDURE dbo.GetExtraPerson kan have to yderligere parametre af typen int :@skip og @pageSize . I tilfælde af @skip er lig med 0 den STORED PROCEDURE kan bare udføre
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 example@sqldat.com AND example@sqldat.com AND E.IsDeleted=0
Hvis @skip er ikke lig med 0 så kan den tilsvarende SQL-sætning være følgende
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 example@sqldat.com AND example@sqldat.com 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
Den fulde kode for dbo.GetExtraPerson kunne handle om følgende
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 example@sqldat.com
AND example@sqldat.com
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 example@sqldat.com AND example@sqldat.com
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 example@sqldat.com AND example@sqldat.com
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
Proceduren ovenfor returnerer det samlede antal poster yderligere, og du kan bruge den til at tildele totalRecords værdi.
Hvis du vil bruge ovenstående kode i kombination med sp_executesql du kan nemt ændre koden til at inkludere ORDER BY i alt SELECT TOP sætninger, så de returnerede værdier svarer til den sorteringsrækkefølge, brugeren anmoder om i jqGrid.