Custom paging by stored procedure
When we need to display thousands of rows. It is better to handle paging by the stored procedure rather than load all records. I will pass parameters like @OrderBy, @OrderDir, @PageNumber, @PageSize to filter data.
Paging Example
Data base table Schema :
Stored Procedure
Paging Example
Data base table Schema :
CREATE TABLE [dbo].[Users](
    [UserID] [int] IDENTITY(1,1) NOT NULL,
    [UserName] [nvarchar(max)] NOT NULL,
    [DateInserted] [datetime] NOT NULL,
    [DateUpdated] [datetime] NULL,
    [LoginID] [int] NOT NULL,
    [EmailAddress] [nvarchar](max) NULL,
    [AddressID] [int] NOT NULL,
    [DateOfBirth] [datetime] NULL,
    [MobilePhone] [varchar](20) NULL,
    [Telephone] [varchar](20) NULL,
    [FirstName] [nvarchar](max) NOT NULL,
    [LastName] [nvarchar](max) NOT NULL,
    [Status] [varchar](max) NOT NULL,
    [OwnerUserID] [int] NOT NULL,
    [ProfilePic] [varchar](500) NULL,
    [GooglePlusProfileURL] [varchar](2000) NULL,
    [AboutUser] [varchar](max) NULL,
 CONSTRAINT [PK_Users_1] PRIMARY KEY CLUSTERED 
(
    [UserID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]Stored Procedure
Create PROCEDURE [sp_GetUsers]
    @UserID INT = 0 ,
    @UserName NVARCHAR(MAX) = '' ,
    @FirstName NVARCHAR(MAX) = '' ,
    @LastName NVARCHAR(MAX) = '' , 
    @OrderBy NVARCHAR(500) = 'UserName' ,
    @OrderDir NVARCHAR(500) = 'ASC' ,
    @PageNumber INT = 0 ,
    @PageSize INT = 0
AS 
    BEGIN
        SET NOCOUNT ON ;
        WITH    UserData
                  AS ( SELECT   U.UserID ,
                                U.DateInserted ,
                                U.DateUpdated ,
                                U.LoginID ,
                                U.EmailAddress ,
                                U.AddressID ,
                                U.DateOfBirth ,
                                U.MobilePhone ,
                                U.Telephone ,
                                U.FirstName ,
                                U.LastName ,
                                U.Status ,
                                U.UserName ,
                                U.ProfilePic ,
                                U.FirstName + ' ' + U.LastName UserFullName ,
                                U.GooglePlusProfileURL ,
                                ISNULL(U.AboutUser, '') AboutUser ,
                                U.OwnerUserID ,
                                ROW_NUMBER() OVER ( ORDER BY CASE
                                                              WHEN @OrderDir = 'DESC'
                                                              THEN CASE
                                                              WHEN @OrderBy = 'UserName'
                                                              THEN u.UserName
                                                              WHEN @OrderBy = 'LastName'
                                                              THEN u.LastName
                                                              WHEN @OrderBy = 'FirstName'
                                                              THEN u.FirstName
                                                              WHEN @OrderBy = 'EmailAddress'
                                                              THEN u.EmailAddress
                                                              END
                                                             END DESC, CASE
                                                              WHEN @OrderDir = 'ASC'
                                                              THEN CASE
                                                              WHEN @OrderBy = 'UserName'
                                                              THEN u.UserName
                                                              WHEN @OrderBy = 'LastName'
                                                              THEN u.LastName
                                                              WHEN @OrderBy = 'FirstName'
                                                              THEN u.FirstName
                                                              WHEN @OrderBy = 'EmailAddress'
                                                              THEN u.EmailAddress
                                                              END
                                                              END ASC, CASE
                                                              WHEN @OrderDir = 'ASC'
                                                              THEN CASE
                                                              WHEN @OrderBy = 'DateInserted'
                                                              THEN u.DateInserted
                                                              END
                                                              END ASC, CASE
                                                              WHEN @OrderDir = 'DESC'
                                                              THEN CASE
                                                              WHEN @OrderBy = 'DateInserted'
                                                              THEN u.DateInserted
                                                              END
                                                              END DESC ) RowNumber
                       FROM    Users AS U                                
                       WHERE    @UserID IN ( U.UserID, 0 )
                                AND @UserName IN ( U.UserName, '' )
                                AND @FirstName IN ( U.FirstName, '' )
                                AND @LastName IN ( U.LastName, '' )
                     )
            SELECT  UserID ,
                    DateInserted ,
                    DateUpdated ,
                    LoginID ,
                    EmailAddress ,
                    AddressID ,
                    DateOfBirth ,
                    MobilePhone ,
                    Telephone ,
                    FirstName ,
                    LastName ,
                    Status ,
                    UserName ,
                    ProfilePic ,
                    UserFullName ,
                    GooglePlusProfileURL ,
                    AboutUser ,
                    OwnerUserID ,
                    ( SELECT    COUNT(UserID)
                      FROM      UserData
                    ) TotalRecords
            FROM    UserData
            WHERE   ( RowNumber BETWEEN ( ( @PageNumber - 1 ) * @PageSize + 1 )
                                AND     ( ( @PageNumber - 1 ) * @PageSize
                                          + @PageSize ) )
                    OR ( @PageSize = 0
                         OR @PageNumber = 0
                       )
            ORDER BY RowNumber ASC ;       
     
    END
| @UserID | UserID is 0 then it returns all User else Passed userid will return. | 
| @UserName | UserName is blank then it returns all User else Passed UserName will return. | 
| @FirstName | FirstName is blank then it returns all User else Passed FirstName will return. | 
| @LastName | LastName is blank then it returns all User else Passed LastName will return. | 
| @OrderBy | Filter by given OrderBy parameter | 
| @OrderDir | Direction is either ASC or DESC | 
| @PageNumber | PageNumber is 0 then returns all row | 
| @PageSize | PageSize is 0 then returns all row | 
ASP.NET , Sql , Sql Server
 
 
 
 
 
Thanks I can use it with custom Grid view paging.
ReplyDelete