代码之家  ›  专栏  ›  技术社区  ›  nos

参数化SQL中的“order by”

  •  4
  • nos  · 技术社区  · 16 年前

    ADO.NET中参数化ORDER BY子句的正确方法是什么?

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

    6 回复  |  直到 10 年前
        1
  •  2
  •   Robert Harvey    16 年前

    SQL注入纯粹主义者会告诉您,永远不允许字符串串联,因为总有可能会有其他程序员扩展程序并将SQL语句公开给外部世界。

    但是,如果值是硬编码的(即作为常量),并且永远看不到外部世界,那么是的,将其连接起来是完全可以的。

        2
  •  4
  •   Rob Farley    16 年前

    尝试这样:

    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, 
      ...
    

    其思想是,如果时间不匹配,则每个case语句的值都将为空。所以如果你选择2,那么你会得到前两个选项的常量。

    因此,使用它,您可以很容易地拥有一些选项,可以让您按照几个字段、降序或任何您想要的内容进行排序。

    抢劫

        3
  •  0
  •   Eric    16 年前

    只要用户不允许通过文本输入,或者可能通过URL访问变量,我就看不到使用字符串串联的任何负面原因。除非像下面的人所说的那样,程序可以由一个不同的用户扩展,而这个用户不需要“注入意识”。

        4
  •  0
  •   Community Mohan Dere    8 年前

    有纯T-SQL解决方案不使用动态SQL。

    • 在SQL 2005之前,您必须按照
    • 在SQL 2005之后,您可以使用行号等

    以下是一些答案: Dynamic order direction . 接受的答案和我的答案说明了这两种方法。也许是特定于SQL Server的。

        5
  •  0
  •   JBrooks    16 年前

    如果没有那么多的数据,我只需要:

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

    然后根据什么改变最后一行。

        6
  •  0
  •   Roman Marusyk S Kotra    10 年前

    Sample:

    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
    

    现在,参数化选择中的排序(基于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