30

我们希望在使用 Visual Studio 数据集设计器创建的查询或存储过程的“排序依据”子句中使用一个参数。

例子:

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

1 回答 1

57

你应该能够做这样的事情:

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被索引覆盖,查询可能仍然需要全排序,而不是按顺序遍历索引。

如果是这种情况,并且您无法忍受性能影响,则可能需要为每个可能的排序顺序提供单独的查询版本,从而使客户端的事情变得相当复杂。

于 2012-12-12T18:29:19.890 回答