I initially marked @Johan's answer as correct because it worked, but I was a little unsure of the INNER JOIN and the overall complexity of this request.
I talked with my colleague about the problem and he came up with this very neat solution (thanks Tom !!), so I decided to share with him:
DECLARE @Skip int DECLARE @Take int DECLARE @OrderBy VARCHAR(50) SET @Skip = 5; SET @Take = 5; SET @OrderBy = 'PriceAsc'; WITH ProductCT AS ( SELECT CASE WHEN @OrderBy = 'TitleAsc' THEN ROW_NUMBER() OVER (ORDER BY p.Title) WHEN @OrderBy = 'TitleDesc' THEN ROW_NUMBER() OVER (ORDER BY p.Title DESC) WHEN @OrderBy = 'PriceAsc' THEN ROW_NUMBER() OVER (ORDER BY p.Price) WHEN @OrderBy = 'PriceDesc' THEN ROW_NUMBER() OVER (ORDER BY p.Price DESC) END AS RowNum , p.ProductId FROM dbo.Product AS p ) SELECT p.ProductId ,p.Title ,p.Price FROM dbo.Product AS p INNER JOIN ProductCT AS pct ON pct.ProductId = p.ProductId WHERE pct.RowNum BETWEEN @Skip + 1 AND (@Skip + @Take) ORDER BY RowNum
source share