程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 數據庫查詢結果的動態排序(5)

數據庫查詢結果的動態排序(5)

編輯:關於SqlServer
五、用戶定義函數

  如果你使用的是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表達式和動態執行能力的各種方案。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved