【问题标题】:Dynamic ORDER BY clause in SQL Server 2008 R2SQL Server 2008 R2 中的动态 ORDER BY 子句
【发布时间】:2010-06-23 07:22:03
【问题描述】:

我们有一个存储过程,我们希望在其中动态地让用户选择对结果进行排序的列和顺序(升序/降序)。目前,我们有以下ORDER BY 子句,但我确信它可以优化。怎么样?

ORDER BY
    CASE WHEN @OrderBy = 'salvnummer' AND @OrderByDirection = 'DESC' THEN salvnummer END DESC, 
    CASE WHEN @OrderBy = 'salvnummer' AND @OrderByDirection = 'ASC' THEN salvnummer END, --ASC
    CASE WHEN @OrderBy = 'entreprenaddel' AND @OrderByDirection = 'DESC' THEN entreprenaddel END DESC, 
    CASE WHEN @OrderBy = 'entreprenaddel' AND @OrderByDirection = 'ASC' THEN entreprenaddel END, --ASC
    CASE WHEN @OrderBy = 'sektion' AND @OrderByDirection = 'DESC' THEN sektion END DESC, 
    CASE WHEN @OrderBy = 'sektion' AND @OrderByDirection = 'ASC' THEN sektion END, --ASC
    CASE WHEN @OrderBy = 'tid' AND @OrderByDirection = 'DESC' THEN tid END DESC,
    CASE WHEN @OrderBy = 'tid' AND @OrderByDirection = 'ASC' THEN tid END --ASC

两个输入参数目前都是varchars

【问题讨论】:

    标签: sql-server-2008 stored-procedures parameters sql-order-by


    【解决方案1】:

    您的查询将无法使用索引来执行排序。如果要使用索引,则必须使用动态 SQL 构建查询,以便最终运行的查询仅包含相关列的 ORDER BY 子句。 This article 解释了如何做到这一点。 SQL 可以这样创建:

    'ORDER BY ' + @OrderBy + ' ' + @OrderByDirection
    

    请注意,使用动态 SQL 会增加 SQL 注入的风险,因此请务必验证您的输入。

    【讨论】:

    • 感谢您的回复。但是,通过索引进行排序不是必需的(行数不多,负载也很低)。我真正追求的是一种优化此代码的编写而不是执行的方法。
    • 如果没有阅读这篇文章,我认为它会满足您的要求和索引优化。
    【解决方案2】:

    您当然可以使用动态 SQL 并根据变量创建 ORDER BY。但是,我不确定这是否一定会导致更有效的查询。一旦参数值可用,优化器很可能会简化您当前的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      相关资源
      最近更新 更多