繁体   English   中英

在SQL中参数化'order by'

[英]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 2005之前,您必须在ORDER BY中使用CASE
  • 在SQL 2005之后,您可以使用ROW_NUMBER等

这里有一些答案: 动态订单方向 接受的答案和我的答案证明了这两种方法。 也许是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM