SQL 內建了豐富的系統函數,像是彙總函數、日期函數等,極大地提升了開發效率。但當遇到特殊業務需求時,我們也可以自行建立使用者定義函數。本文透過一個實際案例,示範如何建立標量函數來解決「將同一訂單下的產品名稱以逗號串聯」的問題。
假設有一張訂單明細表,包含編號、訂單號、產品名稱。我們需要查詢某訂單號對應的所有產品名稱,並用逗號分隔,例如:「筆記型電腦, 滑鼠, 鍵盤」。

在 SSMS 中右鍵選擇「新增函數」→「標量值函數」。標量函數回傳單一值,適合此處只需回傳字串的情境。

CREATE FUNCTION [dbo].[OrderDetailGetStrNameByOrderId]
(
@OrderId INT
)
RETURNS VARCHAR(500)
AS
BEGIN
DECLARE @StrPassengername VARCHAR(500)
SET @StrPassengername = ''
SELECT @StrPassengername = @StrPassengername + Passengername + ', '
FROM OrderDetail
WHERE OrderId = @OrderId
-- 移除尾端多餘的逗號與空白
SELECT @StrPassengername = SUBSTRING(@StrPassengername, 0, LEN(@StrPassengername))
RETURN @StrPassengername
END
建立完成後,即可像內建函數一樣直接在查詢中使用,大幅簡化程式碼:
SELECT DISTINCT A.OrderId,
(SELECT [dbo].[OrderDetailGetStrNameByOrderId](A.OrderId)) AS StrName
FROM OrderDetail A
透過自訂函數封裝邏輯,不僅提高程式碼重用性,也讓主查詢更加清晰易讀。