Há muitas maneiras de implementar
STORED PROCEDURE que você precisa. Por exemplo, você pode usar ROW_NUMBER construção dentro da instrução SQL CTE. Se você usa o SQL Server 2012, pode usar
OFFSET e FETCH após ORDER BY para implementar a paginação (consulte aqui
). No caso, a instrução SQL será muito parecida com as instruções MySQL ou PostgreSQL correspondentes que usam OFFSET e LIMIT . A propósito, o Microsoft Entity Framework usa Entity SQL Language
tendo construção próxima (SKIP e LIMIT ). Provavelmente OFFSET e FETCH seria a maneira preferida se você usasse o SQL Server 2012 ou superior. Como você incluiu a tag do SQL Server 2008 em sua pergunta, eu não usaria novas construções do SQL Server 2012 na minha resposta.
Mais uma boa maneira seria usar
sp_executesql que permite construir uma instrução SQL como string com parâmetros. Permite reutilizar os planos de execução o que é muito importante para o melhor desempenho. A abordagem permite estender o código do seu STORED PROCEDURE para implementar a filtragem do lado do servidor (pesquisa). Vejo que preciso implementar a paginação na instrução SQL que contém o ID dos dados retornados (
PersonId no seu caso). Então eu decido sugerir que você use uma maneira simplificada que use SELECT TOP em combinação com LEFT OUTER JOIN . Você
STORED PROCEDURE dbo.GetExtraPerson pode ter dois parâmetros adicionais do tipo int :@skip e @pageSize . No caso de @skip é igual a 0 o STORED PROCEDURE pode apenas executar 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
Se
@skip não é igual a 0 então a instrução SQL correspondente pode ser a seguinte 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
O código completo de
dbo.GetExtraPerson pode ser sobre o seguinte 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
O procedimento acima retorna o número total de registros adicionalmente e você pode usá-lo para atribuir
totalRecords valor. Se você usar o código acima em combinação com
sp_executesql você pode facilmente modificar o código para incluir ORDER BY em todos os SELECT TOP instruções para que os valores retornados correspondam à ordem de classificação solicitada pelo usuário no jqGrid.