在公共旧事组中,一个经常出现的问题是“怎样才能依据传递给存储过程的参数前往一个排序的输出?”。在一些高水平专家的协助之下,我整理出了这个问题的几种处理方案。
一、用IF...ELSE执行事后编写好的查询
对于大多数人来说,首先想到的做法也许是:通过IF...ELSE语句,执行几个事后编写好的查询中的一个。例如,假设要从Northwind数据库查询得到一个货主(Shipper)的排序列表,发出调用的代码以存储过程参数的方式指定一个列,存储过程依据这个列排序输出结果。Listing 1显示了这种存储过程的一个可能的实现(GetSortedShippers存储过程)。
【Listing 1: 用IF...ELSE执行多个事后编写好的查询中的一个】
CREATE PROC GetSortedShippers
@OrdSeq AS int
AS
IF @OrdSeq = 1
SELECT * FROM Shippers ORDER BY ShipperID
ELSE IF @OrdSeq = 2
SELECT * FROM Shippers ORDER BY CompanyName
ELSE IF @OrdSeq = 3
SELECT * FROM Shippers ORDER BY Phone
这种方法的优点是代码很简单、很容易理解,SQL Server的查询优化器能够为每一个SELECT查询创建一个查询优化计划,确保代码具有最优的功用。这种方法最次要的缺点是,如果查询的要求发生了改变,你必须修正多个独立的SELECT查询——在这里是三个。