Dynamique de la commande de direction
J'ai écrit un SP qui accepte en tant que paramètres de colonne pour trier et de direction.
Je ne veux pas utiliser le SQL dynamique.
Le problème est avec le réglage du paramètre de direction.
C'est le partiel code:
SET @OrderByColumn = 'AddedDate'
SET @OrderDirection = 1;
…
ORDER BY
CASE WHEN @OrderByColumn = 'AddedDate' THEN CONVERT(varchar(50), AddedDate)
WHEN @OrderByColumn = 'Visible' THEN CONVERT(varchar(2), Visible)
WHEN @OrderByColumn = 'AddedBy' THEN AddedBy
WHEN @OrderByColumn = 'Title' THEN Title
END
- Je recommande la cueillette de conversion de modèle pour AddedDate qui permet de s'assurer que les chaînes de caractères seront trier en ordre de date. Je crois que le défaut convertir peut changer avec la localité paramètres. Mieux définir explicitement et être en sécurité.
- Il ne s'applique pas à certains autres types? Ou tout simplement la DATE?
- Les numéros sont également un problème. Par exemple la conversion de 10, 1 et 2 varchar vous donnera une sorte de '1', '10', '2'. J'imagine que vous êtes la conversion Visible et AddedDate varchar en raison d'un CAS de retour tout de même type, correct?
Vous devez vous connecter pour publier un commentaire.
Vous pourriez avoir deux quasi-identique
ORDER BY
éléments,ASC
et unDESC
, et d'étendre votreCASE
déclaration à faire l'un ou l'autre d'entre eux toujours égale à une valeur unique:ORDER BY 1 ASC, Title DESC
, où1
est la position de la colonne dans la liste de sélection, de sens dans ce cas, il serait de l'ordre parcol[1]
premier. Seriez-vous d'accord?ORDER BY 1+1
n' pas commander par la colonne 2. (En fait elle ne change pas l'ordre à tous, depuis le valeur de l'expression est le même pour toutes les lignes).CASE WHEN <condition> THEN NULL
(j'ai eu une erreur sur la conversion de int le type de données nvarchar lors du tri par type nvarchar champ et en utilisant1
au lieu deNULL
. Il est intéressant de noter que vous ne pouvez pas utiliserNULL
ou1+1
normalement dans unORDER BY
. E. G.SELECT * FROM MyTable ORDER BY 1+1
ouNULL
ou de tout autre constante de l'expression " provoque une erreur. Merci pour votre aide.Vous pouvez simplifier le CAS à l'aide de la fonction ROW_NUMBER qui trie vos données et permet de convertir en un pratique format de nombre entier. Surtout depuis que la question est balisé SQL Server 2005
Cela permet également de développer assez facilement pour traiter secondaire et tertiaire sortes
J'ai utilisé multiplicateur pour encore simplifier l'instruction select réelle et de réduire le risque de RBAR d'évaluation dans l'ORDRE PAR
ROW_NUMBER()
's? Je comprends chacuns des données est différente.Voici un exemple:
À partir d'ici:
http://www.dominicpettifer.co.uk/Blog/21/dynamic-conditional-order-by-clause-in-sql-server-t-sql
Cela fonctionne très bien pour moi– (
where
,order by
,direction
,Pagination
)Plus compact version de accepté réponse, mais a accepté de répondre à cette fonctionne très bien seulement si le résultat des expressions après
THEN
ont le même type.