手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Mssql>列表

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

来源:互联网 作者:west263.com 时间:2008-04-02
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
五、用户定义函数

  假如您使用的是SQL Server 2000,想要编写一个用户定义的函数(UDF),这个用户定义函数接受列的名字或编号为参数、返回排序的结果集,Listing 10显示了大多数程式员当成第一选择的方法。

【Listing 10:列名字作为参数,使用UDF】

CREATE FUNCTION ufn_GetSortedShippers

(

@ColName AS sysname

)

RETURNS TABLE

AS

RETURN

SELECT *

FROM Shippers

ORDER BY

CASE @ColName

WHEN 'ShipperID' THEN CASE SIGN(ShipperID)

WHEN -1 THEN '-'

WHEN 0 THEN ' '

WHEN 1 THEN ' '

ELSE NULL

END

RIGHT(REPLICATE('0', 10)

CAST(ABS(ShipperID) AS

varchar(10)), 10)

WHEN 'CompanyName' THEN CompanyName

WHEN 'Phone' THEN Phone

ELSE NULL

END

  但是,SQL Server不接受这个函数,他将返回如下错误信息:

Server: Msg 1033, Level 15, State 1, Procedure ufn_GetSortedShippers,

Line 24

The ORDER BY clause is invalid in views, inline functions, and

subqueries, unless TOP is also specified.

  注意错误信息中的“unless”。SQL Server 2000不允许在视图、嵌入式UDF、子查询中出现ORDER BY子句,因为他们都应该返回一个表,表不能指定行的次序。然而,假如使用了TOP关键词,ORDER BY子句将帮助确定查询所返回的行。因此,假如指定了TOP,您还能够同时指定ORDER BY。由于在带有TOP的UDF中允许使用ORDER BY子句,您能够使用一个技巧:把“SELECT *”替换成“SELECT TOP 100 PERCENT *”。这样,您就能够成功地构造出一个接受列名字或编号为参数、返回排序结果的函数。

  新构造的函数能够按照如下方式调用:

SELECT * FROM ufn_GetSortedShippers('ShipperID')

  现在,您已了解了几种用参数确定查询输出中记录次序的方法。在编写那些允许用户指定查询结果排序标准的列的应用程式时,您能够使用本文介绍的各种技术,用列名字或编号作为参数,构造出使用CASE表达式和动态执行能力的各种方案。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!