sql - order by and sub-query -


i in trouble basical stored procedure, unfortunately not sql expert, trying sort offers result 2 parameters, @orderby , @sortorder, result sorted on result of sub-query. example:

exec [dbo].[gettest2] @page=0,@limit=150,@orderby=n'networkname',@sortorder=n'asc' 

it works expected, but

exec [dbo].[gettest2] @page=0,@limit=15,@orderby=n'networkname',@sortorder=n'asc' 

doesn't works because subquery doesn't return records.

how can sort on entire recordset?

use [mycontext] go  set ansi_nulls on go set quoted_identifier on go alter procedure [dbo].[gettest2]      @page int = 0,     @limit int = 10,     @orderby nvarchar(50) = 'offerid',     @name nvarchar(100) = null,     @sortorder nvarchar(50) = 'asc' begin     set nocount on;     select * (select row_number() over(order @orderby) rownumber,                    count(*) over() [total_rows],                    a.name networkname,                    o.*                      offers o                      left outer join affiliatenetworks on o.networkid = a.id                    (@name null or o.name '%' + @name + '%' )) paged            paged.rownumber > @limit * @page ,      paged.rownumber <= (@limit * @page) + @limit      order                      case                          when @sortorder <> 'asc' null                         when @orderby = 'name' name                         end asc,                     case                          when @sortorder <> 'asc' null                         when @orderby = 'networkname' networkname                         end asc,                     case                          when @sortorder <> 'desc' null                         when @orderby = 'name' name                         end desc,                     case                          when @sortorder <> 'desc' null                         when @orderby = 'networkname' networkname                         end desc  end  

you might consider adding sorting within row_number keep paging consistent. wrapped sub-query in cte make little easier read.

alter procedure [dbo].[gettest2]      @page int = 0,     @limit int = 10,     @orderby nvarchar(50) = 'offerid',     @name nvarchar(100) = null,     @sortorder nvarchar(50) = 'asc' begin     set nocount on;      ;with paged (         select row_number() on (             order                 case when @sortorder = 'asc'                     (case @orderby when = 'name' name when 'networkname' a.name end) end asc,                 case when @sortorder = 'desc'                     (case @orderby when = 'name' name when 'networkname' a.name end) end desc)             ) rownumber,             count(*) over() [total_rows],             a.name networkname,             o.*         offers o              left outer join affiliatenetworks on o.networkid = a.id         (@name null or o.name '%' + @name + '%' )     )         select *         paged         rownumber - (@limit * @page) between 1 , @limit         order rownumber end go 

as mentioned in comments, row_number may not best construct paging in later versions of sql server. if using @ least 2012 or higher, can use offset , fetch next paging. query becomes this:

    select         count(*) over() [total_rows],         case @orderby when = 'name' o.name when 'networkname' a.name end sortname,         a.name networkname,         o.*     offers o          left outer join affiliatenetworks on o.networkid = a.id     (@name null or o.name '%' + @name + '%' )     order         case when @sortorder = 'asc' sortname else null end asc,         case when @sortorder = 'desc' sortname else null end desc     offset (@page * @limit) rows     fetch next @limit rows only; 

Comments

Popular posts from this blog

inversion of control - Autofac named registration constructor injection -

verilog - Systemverilog dynamic casting issues -

ios - Change Storyboard View using Seague -