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.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser un complexe
order by
clause. Qui nécessite uncase
pour chaque sens de tri et de chaque type de données. Avec cet exemple dataset:Vous pouvez utiliser un
order by
clause comme:Exemple de travail en SQL, Violon.
Une autre option est de créer la requête dynamiquement, et l'exécuter avec
exec
. Par exemple:case
est requis pour chaque type de données et chaque ordre de tri. Le SQL dynamique est un peu plus simple je pense.)order by
clause beaucoup plus simple. Pour une colonne de date, assurez-vous que le type est correct. Essayez... when @sortOrder <> 'ASC' then cast(null as datetime) ...
@Andomar la réponse de l'aider à résoudre un problème similaire. J'avais besoin de trier sur un certain nombre de 23 colonnes différentes, dans n'importe quel ordre. J'ai fini par le suivant:
L'ajout de paramètre @tri à la SP pour identifier les entrées dans le tri:
Il existe deux approches de base pour construire dynamiquement peut être commandé procédures stockées:
Passer dans le
ORDER BY
la clause en tant que paramètre à la procédure stockée. Dans la procédure stockée, construire l'instruction SQL dans une chaîne de caractères, puis d'exécuter cette instruction à l'aide deEXEC
ousp_ExecuteSql
.Passer dans la colonne à trier par, puis utiliser un
CASE
instruction dans leORDER BY
clause de trier les résultats en fonction de la valeur du paramètre d'entrée.quelque chose comme cela devrait fonctionner :
SortType
ne fonctionne pas. SQL Server n'autorise pas une variable à la place d'un nom de colonne.@SortType
, c'est à dire, il ne sera pas de tri à tous les