我正在创建下面的存储过程。
declare @PageNum as Int declare @PerPageResult as Int declare @StartDate as varchar(25) declare @EndDate as varchar(25) declare @SortType as Varchar(50) declare @SortDirection as Varchar(4) set @PageNum=1 set @PerPageResult=20 set @StartDate='2008-02-08' set @EndDate='2015-02-08' set @SortType='RegDate' set @SortDirection='Desc' declare @Temp Table(RowNum int, RegDate Date, Registered int, Female int, Male int, [Join] int, Rebill int, TotalPointsEarned int, Expire int) declare @sort varchar(50) Insert into @Temp Select ROW_NUMBER() over (order by @SortType+' '+@SortDirection) As RowNum, * From ( SELECT CAST(m.registrationdate AS Date) as RegDate, count(m.id) Registered, count(CASE WHEN m.gender='F' then 'F' end) As Female, count(CASE WHEN m.gender='M' then 'M' end) As Male count(CASE WHEN p.paymenttransactiontype='N' then 'N' end) As [Join], count(CASE WHEN p.paymenttransactiontype='R' then 'R' end) As Rebill, count(m.tokensearned) As TotalPointsEarned, count(CASE WHEN p.paymenttransactiontype='E' then 'E' end) As Expire from member m join payment p on m.id=p.id_member join user_role u on u.member_id=m.id where u.role_id <> 3 and CAST(m.registrationdate AS Date) > @StartDate and CAST(m.registrationdate AS Date) < @EndDate GROUP BY CAST(m.registrationdate AS Date) ) as aa Select * from @Temp Where RowNum>((@PageNum-1)*@PerPageResult) and RowNum<=@PerPageResult * @PageNum Order by @SortType+' '+@SortDirection
在上面,当我Order by动态地传递该子句时,它不能正确地对数据进行排序,但是当我显式地写入列名时,它可以很好地工作。可能是其采取@SortType+' '+@SortDirection的varchar,而不是Date
Order by
@SortType+' '+@SortDirection
varchar
Date
我尝试写作Order by case when (@Sort='RegDate' and @SortDirection='Desc') Then RegDate End Desc,但是没有用
Order by case when (@Sort='RegDate' and @SortDirection='Desc') Then RegDate End Desc
我如何在这里动态传递订单。
编辑:@Andomar:我尝试了您提供的解决方案,并为Date类型添加了一个字段。而且它也不起作用。
以下是我的工作。
create table t1 (id int, name varchar(50), dt date); insert t1 values (1, 'Chihiro Ogino','2009-02-08'), (2, 'Spirit of the Kohaku River','2008-02-08'), (3, 'Yubaba','2012-02-08'); declare @sortColumn varchar(50) = 'dt' declare @sortOrder varchar(50) = 'ASC' select * from t1 order by case when @sortOrder <> 'ASC' then 0 when @sortColumn = 'id' then id end ASC , case when @sortOrder <> 'ASC' then '' when @sortColumn = 'name' then name end ASC , case when @sortOrder <> 'ASC' then '' when @sortColumn = 'dt' then name end ASC , case when @sortOrder <> 'DESC' then 0 when @sortColumn = 'id' then id end DESC , case when @sortOrder <> 'DESC' then '' when @sortColumn = 'name' then name end DESC , case when @sortOrder <> 'DESC' then '' when @sortColumn = 'dt' then name end DESC
您可以使用一个复杂的order by子句。case每个排序方向和每种数据类型都需要一个。使用此示例数据集:
order by
case
create table t1 (id int, name varchar(50), created date); insert t1 values (1, 'Chihiro Ogino', '2012-01-01'), (2, 'Spirit of the Kohaku River', '2012-01-03'), (3, 'Yubaba', '2012-01-02');
您可以使用order by类似以下的子句:
declare @sortColumn varchar(50) = 'created' declare @sortOrder varchar(50) = 'DESC' select * from t1 order by case when @sortOrder <> 'ASC' then 0 when @sortColumn = 'id' then id end ASC , case when @sortOrder <> 'ASC' then '' when @sortColumn = 'name' then name end ASC , case when @sortOrder <> 'ASC' then cast(null as date) when @sortColumn = 'created' then created end ASC , case when @sortOrder <> 'DESC' then 0 when @sortColumn = 'id' then id end DESC , case when @sortOrder <> 'DESC' then '' when @sortColumn = 'name' then name end DESC , case when @sortOrder <> 'DESC' then cast(null as date) when @sortColumn = 'created' then created end DESC
SQL Fiddle的工作示例。
另一种选择是动态创建查询,并使用运行查询exec。例如:
exec
declare @sql nvarchar(max) set @sql = 'select * from YourTable order by ' + @sortColumn + ' ' + @sortDir exec (@sql)