在ADO.NET中参数化order by子句的正确方法是什么?
有时需要按2列排序,而默认情况下只需1列排序,有时您只想将ASC更改为DEC。 在这种情况下只使用字符串连接是否可以(如果输入不是直接来自用户,而只是在代码中查找或多或少的硬编码值)
答案 0 :(得分:4)
试试这样:
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,那么您将获得前两个选项的常量值。
因此,使用此功能,您可以轻松地使用一些选项,让您按几个字段,降序或任何您想要的内容进行排序。
罗布
答案 1 :(得分:2)
SQL注入纯粹主义者会告诉你字符串连接是绝对不允许的,因为总有可能另一个程序员可能会扩展程序并将SQL语句暴露给外界。
但是,如果值是硬编码的(即作为常量),并且永远不会看到外部世界,那么是的,将它连接起来是完全可以的。
答案 2 :(得分:0)
只要用户不允许通过文本输入或者可能通过url访问变量,我就没有看到使用字符串连接的任何负面原因。除非像下面的那个人说的那样,程序可能会由不同的“注入意识”的用户扩展。
答案 3 :(得分:0)
有些纯T-SQL解决方案不使用动态SQL。
这里有一些答案:Dynamic order direction。接受的答案和我的答案证明了这两种方法。也许是SQL Server特有的。
答案 4 :(得分:0)
如果不是那么多数据,我只会:
DataTable dt = ....
DataView dv = new DataView(dt);
dv.Sort = "LastName DESC, FistName";
然后根据任何内容改变最后一行。
答案 5 :(得分:0)
样品:
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'
Arya表:
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