In day to day work, we often need data to be displayed in Grid
that needs sorting, paging and filtering on User Interface, whether web or Windows. I often struggle to find a unified solution. I found that the best way is to have fetch data in required format from stored procedure and just have presentation logic on UI rather than mixing a lot of logic for Sorting, Paging and Filtering. Here, I am presenting a simple approach to have data from Stored Procedure in required format based on given parameters.
CREATE PROCEDURE USP_SEL_Contacts
(
@ContactID INT = NULL,
@FirstName NVARCHAR(50) = NULL,
@LastName NVARCHAR(50) = NULL,
@EmailAddress NVARCHAR(50) = NULL,
@EmailPromotion INT = NULL,
@Phone NVARCHAR(25) = NULL,
@PageNo INT = 1,
@PageSize INT = 10,
@SortColumn NVARCHAR(20) = ‘Title’,
@SortOrder NVARCHAR(4)=‘ASC’
)
AS
BEGIN
DECLARE
@lContactID INT,
@lFirstName NVARCHAR(50),
@lLastName NVARCHAR(50),
@lEmailAddress NVARCHAR(50),
@lEmailPromotion INT,
@lPhone NVARCHAR(25),
@lPageNbr INT,
@lPageSize INT,
@lSortCol NVARCHAR(20),
@lFirstRec INT,
@lLastRec INT,
@lTotalRows INT
SET @lContactID = @ContactID
SET @lFirstName = LTRIM(RTRIM(@FirstName))
SET @lLastName = LTRIM(RTRIM(@LastName))
SET @lEmailAddress = LTRIM(RTRIM(@EmailAddress))
SET @lEmailPromotion = @EmailPromotion
SET @lPhone = LTRIM(RTRIM(@Phone))
SET @lPageNbr = @PageNo
SET @lPageSize = @PageSize
SET @lSortCol = LTRIM(RTRIM(@SortColumn))
SET @lFirstRec = ( @lPageNbr – 1 ) * @lPageSize
SET @lLastRec = ( @lPageNbr * @lPageSize + 1 )
SET @lTotalRows = @lFirstRec – @lLastRec + 1
; WITH CTE_Results
AS (
SELECT ROW_NUMBER() OVER (ORDER BY
CASE WHEN (@lSortCol = ‘ContactID’ AND @SortOrder=‘ASC’)
THEN ContactID
END ASC,
CASE WHEN (@lSortCol = ‘ContactID’ AND @SortOrder=‘DESC’)
THEN ContactID
END DESC,
CASE WHEN (@lSortCol = ‘Title’ AND @SortOrder=‘ASC’)
THEN Title
END ASC,
CASE WHEN @lSortCol = ‘Title’ AND @SortOrder=‘DESC’
THEN Title
END DESC,
CASE WHEN @lSortCol = ‘FirstName’ AND @SortOrder=‘ASC’
THEN FirstName
END ASC,
CASE WHEN @lSortCol = ‘FirstName’ AND @SortOrder=‘DESC’
THEN FirstName
END DESC,
CASE WHEN @lSortCol = ‘MiddleName’ AND @SortOrder=‘ASC’
THEN MiddleName
END ASC,
CASE WHEN @lSortCol = ‘MiddleName’ AND @SortOrder=‘DESC’
THEN MiddleName
END DESC,
CASE WHEN @lSortCol = ‘LastName’ AND @SortOrder=‘ASC’
THEN LastName
END ASC,
CASE WHEN @lSortCol = ‘LastName’ AND @SortOrder=‘DESC’
THEN LastName
END DESC,
CASE WHEN @lSortCol = ‘Suffix’ AND @SortOrder=‘ASC’
THEN Suffix
END ASC,
CASE WHEN @lSortCol = ‘Suffix’ AND @SortOrder=‘DESC’
THEN Suffix
END DESC,
CASE WHEN @lSortCol = ‘EmailAddress’ AND @SortOrder=‘ASC’
THEN EmailAddress
END ASC,
CASE WHEN @lSortCol = ‘EmailAddress’ AND @SortOrder=‘DESC’
THEN EmailAddress
END DESC,
CASE WHEN @lSortCol = ‘EmailPromotion’ AND @SortOrder=‘ASC’
THEN EmailPromotion
END ASC,
CASE WHEN @lSortCol = ‘EmailPromotion‘ AND @SortOrder=‘DESC’
THEN EmailPromotion
END DESC,
CASE WHEN @lSortCol = ‘Phone’ AND @SortOrder=’ASC’
THEN Phone
END ASC,
CASE WHEN @lSortCol = ‘Phone’ AND @SortOrder=’DESC’
THEN Phone
END DESC
) AS ROWNUM,
Count(*) over () AS TotalCount,
ContactID,
Title,
FirstName,
MiddleName,
LastName,
Suffix,
EmailAddress,
EmailPromotion,
Phone
FROM Contact
WHERE
(@lContactID IS NULL OR ContactID = @lContactID)
AND(@lFirstName IS NULL OR FirstName LIKE ‘%’ + @lFirstName + ‘%’)
AND(@lLastName IS NULL OR LastName LIKE ‘%’ + @lLastName + ‘%’)
AND (@lEmailAddress IS NULL OR EmailAddress LIKE ‘%’ + @lEmailAddress + ‘%’)
AND (@lEmailPromotion IS NULL OR EmailPromotion = @lEmailPromotion)
AND (@lPhone IS NULL OR Phone LIKE ‘%’ +@lPhone+ ‘%’)
)
SELECT
TotalCount,
ROWNUM,
ContactID,
Title,
FirstName,
MiddleName,
LastName,
Suffix,
EmailAddress,
EmailPromotion,
Phone
FROM CTE_Results AS CPC
WHERE
ROWNUM > @lFirstRec
AND ROWNUM < @lLastRec
ORDER BY ROWNUM ASC
END
GO
SP can be used to filter data as per given parameters as:
No parameters provided, fetch first 10 default records with title in ascending Order :
EXEC USP_SEL_Contacts
On providing @SortCol = ‘FirstName’ and @SortOrder=’Asc’,
will fetch 10 records sorted by First Name in ascending order:
EXEC USP_SEL_Contacts @SortColumn = ‘FirstName’, @SortOrder=‘Asc’
On providing @SortCol = ‘LastName’, will fetch 10 records
sorted by Last Name in descending order:
EXEC USP_SEL_Contacts @SortColumn = ‘FirstName’, @SortOrder=‘Desc’
Following query will pull out 20 records in a page having
Email Address ‘b@b.cc’ sorted by Last Name in Descending order:
EXEC USP_SEL_Contacts @EmailAddress = ‘b@b.cc’, @PageSize = 20, @PageNo=1,
@SortColumn = ‘LastName’ , @SortOrder=‘Desc’
Note: Please note that while publishing blog single quotes ‘ & minus sign – are converted to some unrecognizable characters, if you have error like:
Msg 102, Level 15, State 1, Procedure USP_SEL_Contacts, Line 14
Incorrect syntax near ‘‘’.
Msg 137, Level 15, State 2, Procedure USP_SEL_Contacts, Line 42
Must declare the scalar variable "@SortColumn".
Msg 102, Level 15, State 1, Procedure USP_SEL_Contacts, Line 43
Incorrect syntax near ‘–’.
Msg 102, Level 15, State 1, Procedure USP_SEL_Contacts, Line 45
Incorrect syntax near ‘–’.
Msg 102, Level 15, State 1, Procedure USP_SEL_Contacts, Line 49
Incorrect syntax near ‘‘’.
Please replace those characters by single quotes & minus sign respectively.