我们想在使用Visual Studio DataSet Designer创建的查询或存储过程的“Order By”子句中使用参数。

例:

  FROM TableName
 WHERE (Forename LIKE '%' + @SearchValue + '%') OR
       (Surname LIKE '%' + @SearchValue + '%') OR
       (@SearchValue = 'ALL')
ORDER BY @OrderByColumn

显示此错误:
Variables are only allowed when ordering by an expression referencing
a column name.

最佳答案

您应该能够执行以下操作:

SELECT *
FROM
    TableName
WHERE
    (Forename LIKE '%' + @SearchValue + '%') OR
    (Surname LIKE '%' + @SearchValue + '%') OR
    (@SearchValue = 'ALL')
ORDER BY
    CASE @OrderByColumn
    WHEN 1 THEN Forename
    WHEN 2 THEN Surname
    END;
  • 将1分配给@OrderByColumn以对Forename进行排序。
  • 分配2以对Surname进行排序。
  • 等...您可以将此方案扩展为任意数量的列。


  • 但是要小心性能。这些类型的构造可能会干扰查询优化器找到最佳执行计划的能力。例如,即使Forename被索引覆盖,查询仍可能需要完整的排序,而不仅仅是按顺序遍历索引。

    如果是这种情况,并且您不能忍受性能影响,则可能有必要为每个可能的排序顺序使用单独的查询版本,从而使客户端复杂得多。

    08-16 00:29