Following is a Paging enabled Query for SQL server, it is working well without dynamic order by @pOrderBy variable .
I want to implement two things in this query.
- I want to sort the rows according to the column name i m passing.
-
I want to run another Query in it to get total number of rows so that I can display number of pages on my UI.
ALTER PROCEDURE [dbo].[usp_get_all_groups] -- Add the parameters for the stored procedure here @pStartIndex smallint, @pPageSize tinyint, @pOrderBy varchar(20) AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; SELECT GroupTable._id, GroupTable.GroupCode, GroupTable.Type, GroupTable.Description From( Select ROW_NUMBER() OVER ( ORDER BY UG._id, UG.GroupCode, UG.Type, UG.Description ) as [Row_Number], UG._id, UG.GroupCode, UG.Type, UG.Description From UserGroups as UG ) as GroupTable where GroupTable.[Row_Number] BETWEEN @pStartIndex AND @pStartIndex + @pPageSize ORDER BY GroupTable.[Row_Number] END
You will need to use dynamic SQL for that – it is not possible to use a column name in a variable on a regular query.
An alternative is to use
CASEin theORDER BYclause – checking the value of the variable and using the corresponding column. See the comment from @Dems.Use an output parameter or return value and assign the value of such a query to it in this stored procedure.