De passage dynamique de la commande par dans une procédure stockée

Je suis entrain de créer ci-dessous la procédure stockée.

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

Ci-dessus lorsque je passe l' Order by clause de manière dynamique, ses de ne pas trier les données correctement, mais quand j'écris le nom de colonne explicitement, il fonctionne très bien. Peut-être sa prise @SortType+' '+@SortDirection comme varchar plutôt que Date

J'ai essayé d'écrire Order by case when (@Sort='RegDate' and @SortDirection='Desc') Then RegDate End Desc, mais il ne fonctionne pas

Comment puis-je passer commande par dynamiquement ici.

Edit:
@Andomar: j'ai essayé ta solution et ajouté encore un champ de type Date. Et ça ne fonctionne pas trop.

ci-dessous est ce que j'ai fait.

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
  • sexe='SH': vous n'avez pas vu ça avant...
  • L'ignorer 😛
  • recherche pour "ORDRE PAR CAS"
  • au lieu de cas, nous avons une meilleure solution que j'ai 11 colonnes pour le type de tri.
  • Ou, trier sur le client! C'est tellement plus facile!
  • Le tri sur côté client ne va pas aider, supposons que vous avez 10000 enregistrements dans la base de données et vous faites preuve de 10 à la fois. Côté client pourrait se produire dans les 10 dossiers seulement, c'est même pas correct.
  • Très vrai. J'ai trouvé cette question, à la recherche de la sorte, pas la pagination, et réalisé que le tri de la .NET code est effectivement ce que j'avais besoin, et que c'était suffisant. La question n'est pas de m'aider, et j'ai donc été poster pour aider ceux qui ne devait le tri et avait couru à travers ce. Désolé, j'étais déjà pas clair.