我们有一个存储过程,我们希望动态地让用户选择按哪个列对结果进行排序,以及按顺序(升序/降序)排序。目前,我们有以下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
。
答案 0 :(得分:2)
您的查询将无法使用索引执行排序。如果要使用索引,则必须使用动态SQL构建查询,以便最终运行的查询仅包含相关列的ORDER BY子句。 This article解释了如何做到这一点。 SQL可以像这样创建:
'ORDER BY ' + @OrderBy + ' ' + @OrderByDirection
请注意,使用动态SQL会增加SQL注入的风险,因此请务必验证您的输入。
答案 1 :(得分:0)
您当然可以使用动态SQL并根据变量创建ORDER BY。但是,我不确定这是否必然会导致更有效的查询。一旦参数值可用,优化器就可以很好地简化您当前的解决方案。