假設有一個表單叫 VIP ,裡面存放著二個欄位:
CustomerId varchar(5) VIP 會員編號 ReferCustomerId varchar(5) 推薦人的會員編號
CustomerId 、ReferCustomerId 會員編號是參照到 Customer 的表單:
Id varchar(5) 會員編號 Name varchar(50) 會員姓名
假設有100萬個會員,而我們要產生以下四個欄位的報表:
[VIP 會員編號]、[VIP 會員姓名]、[推薦人的會員編號]、[推薦人的會員姓名]
你會怎麼做呢?
如果只是一般的查詢倒可以在程式裡面寫一個像 getEmployeeName(Id) 的函式,再用迴圈跑起來:
do until rs.EOF print getEmployeeName(rs.Fields("CustomerId").Value) print getEmployeeName(rs.Fields("ReferCustomerId").Value) rs.MoveNext loop
這種做法的好處是程式可攜性高,換成任何一個資料庫都可以用。但是在上百萬筆的迴圈下,程式的時間都花在開啟多個連線查詢會員姓名,而完全無法發揮料庫的效能。
這時就要思考如何只透過一個 SQL Command 來完成這個報表。
當然方法有很多種,包括現在我們要介紹的 SQL Server 自訂函數功能。
自訂函數最大的好處可以讓 SQL Command 就像在寫程式一樣,不但可以大量簡化 SQL Command,也可以使邏輯更為清楚。
我們現在來寫一個 getEmployeeName(Id) 的 SQL Server 自訂函數版本:
完成後便可應用在產生報表上,SQL Command 可以這樣下:
藉由這個例子可以了解自訂函數的便利性,然而在商業用途上的應 用,欄位可不會只有這四個,尤其在有大量 Code Table Schema 及遇到複雜邏輯的時候,使用 SQL Server 的自訂函數可以加速程式的開發,也能降低邏輯上的錯誤,實在是非常便利好工具。
2 comments On [SQL Server] 利用自訂函數簡化指令及提升軟體效能
neo:
thanks ,you give us more information to learn well SQL
can you tell us about SQL table index information?
ping:
謝謝你的留言。不過最近很忙,只能 等有空的時候再說囉。Orz