数据库查询结果的动态排序(6)

现在,如果我们用任意三个列名字之一作为参数调用存储过程,存储过程都能够正确地返回结果。Richard Romley提出了一种巧妙的处理方法,如Listing 6所示。它不再要求我们搞清楚可能涉及的列数据类型。
 
   
   
   
 
 
   
   
     
       
         
       
     
     
   
 
 
   
   
   
 
这种方法把ORDER BY子句分成三个独立的CASE表达式,每一个表达式处理一个不同的列,避免了由于CASE只返回一种特定数据类型的能力而导致的问题。



【Listing 6:用列名字作为参数,Romley提出的方法】


ALTER PROC GetSortedShippers

@ColName AS sysname

AS


SELECT *

FROM Shippers

ORDER BY

CASE @ColName WHEN 'ShipperID'

THEN ShipperID ELSE NULL END,

CASE @ColName WHEN 'CompanyName'

THEN CompanyName ELSE NULL END,

CASE @ColName WHEN 'Phone'

THEN Phone ELSE NULL END





  按照这种方法编写代码,SQL Server能够为每一个CASE表达式返回恰当的数据类型,而且无需进行数据类型转换。但应该注意的是,只有当指定的列不需要进行计算时,索引才能够优化排序操作。

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [SQL] 的这些文章也感兴趣:

解决Web 服务中使用NHibernate时无法序列化IList的问题
IBatis.Net使用方法之四:常用的查询方式
SQL进行排序、分组、统计的10个新技巧
SQL语句的自动优化
Web数据库中间件技术
微软发布3款SQL Injection攻击检测工具
利用数据库日志恢复数据到时间点的操作
Castle-Active Record的使用方法
NHibernate实现并发控制的方法
保持多台服务器数据的一致性