2009-07-31 10 views
4

Quelle est la bonne façon de paramétrer une clause order by dans ADO.NET?Paramétrer 'order by' dans SQL

Parfois, il est nécessaire de commander par 2 colonnes, alors que la commande par défaut est sur une seule colonne, et parfois vous voudrez juste changer ASC en DEC. Est-il considéré correct d'utiliser simplement la concaténation de chaîne dans de tels cas (à condition que l'entrée ne provienne pas directement de l'utilisateur, mais juste une recherche de valeurs plus ou moins codées dans le code)

Répondre

2

Les puristes de l'injection SQL diront vous que la concaténation de chaîne n'est jamais permise, car il existe toujours la possibilité qu'un autre programmeur puisse étendre le programme et exposer l'instruction SQL au monde extérieur. Cependant, si les valeurs sont codées en dur (c'est-à-dire en tant que constante), et ne verront jamais le monde extérieur, alors oui, il est parfaitement correct de concaténer.

+0

Ça va marcher, mais que faites-vous quand vous voulez parfois @ Sortby1 et parfois @ Sortby1, @ Soryby2 - juste une manipulation de chaîne? – nos

+0

Pas dans SQL Server. L'utilisation de composants client MS (selon les balises) peut impliquer SQL Server – gbn

0

Tant que l'utilisateur n'est pas autorisé à saisir du texte ou peut éventuellement accéder à la variable via l'URL, je ne vois aucune raison négative d'utiliser la concaténation de chaîne. Sauf comme le dit le gars ci-dessous, le programme peut être étendu par un utilisateur différent qui n'est pas si "conscient de l'injection".

0

Il existe des solutions T-SQL qui n'utilisent pas SQL dynamique.

  • pré SQL 2005, vous deviez utiliser CASE dans la clause ORDER BY
  • Après SQL 2005, vous pouvez utiliser ROW_NUMBER etc

Quelques réponses ici: Dynamic order direction. La réponse acceptée et ma réponse démontrent les 2 approches. Peut-être que SQL Server spécifique cependant.

0

S'il est pas beaucoup de données, je devrai simplement:

DataTable dt = .... 
DataView dv = new DataView(dt); 
dv.Sort = "LastName DESC, FistName"; 

puis varier la dernière ligne sur la base que ce soit.

4

Essayez comme ceci:

SELECT ... 
ORDER BY 
    CASE WHEN @OrderBy = 'Option1' THEN SomeField END, 
    CASE WHEN @OrderBy = 'Option1' THEN SomeOtherField END DESC, 
    CASE WHEN @OrderBy = 'Option2' THEN Field75 END, 
    ... 

L'idée est que chaque case évaluera NULL si WHEN ne correspond pas. Donc, si vous mettez Option2, vous obtenez une valeur constante pour les deux premières options. Donc, en utilisant cela, vous pouvez facilement avoir quelques options qui vous permettent de trier par plusieurs champs, ou en descendant, ou ce que vous voulez.

Rob

0

Exemple:

SELECT 1 AS Num, '2015-06-22' AS Datex INTO Arya 
INSERT INTO Arya 
SELECT 2, '2015-08-17' UNION SELECT 3, '2015-07-14' 

Table Arya:

Num Datex 
----------------- 
1, 2015-06-22 
2, 2015-08-17 
3, 2015-07-14 

Maintenant, le tri Paramétrer (base sur le terrain Datex) dans une sélection ....

SELECT Num, Date1 FROM ARYA, (SELECT -1 as e union Select 1 as e) a 
WHERE a.e=1 --(1) For ASC sort --(OR a.e=-1) For Desc Sort 
ORDER BY DATEDIFF(DAY, '2000-01-01', Arya.Datex)*a.e 


Result: ASC Sort IF 1 
1, 2015-06-22 
3, 2015-07-14 
2, 2015-08-17 

Result: ASC Sort IF -1 
2, 2015-08-17 
3, 2015-07-14 
1, 2015-06-22 
Questions connexes