[英]Parameterize 'order by' in SQL
在ADO.NET中参数化order by子句的正确方法是什么?
有时需要按2列排序,而默认情况下只需1列排序,有时您只想将ASC更改为DEC。 在这种情况下只使用字符串连接是否可以(如果输入不是直接来自用户,而只是在代码中查找或多或少的硬编码值)
试试这样:
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,
...
我们的想法是,如果WHEN不匹配,每个CASE语句将评估为NULL。 因此,如果您放置Option2,那么您将获得前两个选项的常量值。
因此,使用此功能,您可以轻松地选择一些选项,以便按几个字段或降序排序,或者根据需要进行排序。
抢
SQL注入纯粹主义者会告诉你字符串连接是绝对不允许的,因为总有可能另一个程序员可能会扩展程序并将SQL语句暴露给外部世界。
但是,如果值是硬编码的(即作为常量),并且永远不会看到外部世界,那么是的,将它连接起来是完全可以的。
只要用户不允许通过文本输入或者可能通过url访问变量,我就没有看到使用字符串连接的任何负面原因。 除非像下面的那个人说的那样,程序可能会由不同的“注入意识”的用户扩展。
有些纯T-SQL解决方案不使用动态SQL。
这里有一些答案: 动态订单方向 。 接受的答案和我的答案证明了这两种方法。 也许是SQL Server特有的。
如果数据不是那么多,我只会:
DataTable dt = ....
DataView dv = new DataView(dt);
dv.Sort = "LastName DESC, FistName";
然后根据任何内容改变最后一行。
样品:
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'
艾莉亚表:
Num Datex
-----------------
1, 2015-06-22
2, 2015-08-17
3, 2015-07-14
现在,在SELECTION中参数化排序(基于Datex字段)....
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.