"Order By"使用列名称的参数

Ema*_*een 20 sql sql-server parameters sql-order-by visual-studio

我们希望在使用Visual Studio DataSet Designer创建的查询或存储过程的"Order By"子句中使用参数.

例:

  FROM TableName
 WHERE (Forename LIKE '%' + @SearchValue + '%') OR
       (Surname LIKE '%' + @SearchValue + '%') OR
       (@SearchValue = 'ALL')
ORDER BY @OrderByColumn
Run Code Online (Sandbox Code Playgroud)

显示此错误:

Variables are only allowed when ordering by an expression referencing 
a column name.
Run Code Online (Sandbox Code Playgroud)

Bra*_*vic 44

你应该可以做这样的事情:

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;
Run Code Online (Sandbox Code Playgroud)
  • 分配1以@OrderByColumn进行排序Forename.
  • 分配2进行排序Surname.
  • 等等...您可以将此方案扩展为任意数量的列.

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

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