在SQL中参数化'order by'

时间:2009-07-31 21:09:43

标签: c# sql ado.net

在ADO.NET中参数化order by子句的正确方法是什么?

有时需要按2列排序,而默认情况下只需1列排序,有时您只想将ASC更改为DEC。 在这种情况下只使用字符串连接是否可以(如果输入不是直接来自用户,而只是在代码中查找或多或少的硬编码值)

6 个答案:

答案 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。

  • 在SQL 2005之前,您必须在ORDER BY中使用CASE
  • 在SQL 2005之后,您可以使用ROW_NUMBER等

这里有一些答案: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