SQL Server 2008 R2中的动态ORDER BY子句

时间:2010-06-23 07:22:03

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

我们有一个存储过程,我们希望动态地让用户选择按哪个列对结果进行排序,以及按顺序(升序/降序)排序。目前,我们有以下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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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