sql - "Order By"使用参数作为列名

标签 sql sql-server visual-studio parameters sql-order-by

我们希望在使用 Visual Studio 数据集设计器创建的查询或存储过程的“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 以按姓氏排序。
  • 等等...您可以将此方案扩展到任意数量的列。
<小时/>

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

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

关于sql - "Order By"使用参数作为列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13844678/

相关文章:

mysql - 警告(代码 1411): Incorrect datetime value:

mysql - 编号为 :count format 的表中的中值

sql - 检查 ROW 中的 EMAIL 格式并在 SELECT 查询中返回值

visual-studio - 如何关闭 Visual Studio 中的图像预览

sql - 将值从实数值列复制到 SQL 中的小数值列

mysql - 将 id 替换为现有查询中另一个表的名称

c# - 如何使用 C# 将二维数组插入数据库

sql-server - 如何在运行时在 DatabaseGeneeratedOption.Identity、Compulated 和 None 之间切换,而不必生成空的 DbMigrations

c# - 如何在调试中访问根命名空间

c++ - win7 + vc7.1 + mfc = 计算器