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 [email protected] AND [email protected] 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 [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
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 [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
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.