在本教學中,將瞭解SQL Server標量函數以及如何使用它們來封裝公式或業務邏輯,並在查詢中重用它們。
標量函數是什麼
SQL Server標量函數接受一個或多個參數並返回單個值。
標量函數可幫助簡化代碼。 例如,可能有許多查詢中出現的複雜計算。可以創建一個標量函數來封裝公式並在查詢中使用它,而不是在每個查詢中包含公式。
創建標量函數
要創建標量函數,請使用CREATE FUNCTION
語句,如下所示:
CREATE FUNCTION [schema_name.]function_name (parameter_list)
RETURN data_type AS
BEGIN
statements
RETURN value
END
在上面語法中,
- 首先,在
CREATE FUNCTION
關鍵字後指定函數的名稱。架構名稱是可選的。 如果沒有明確指定它,SQL Server默認使用dbo
。 - 其次,在函數名後面指定括弧括起來的參數列表。
- 第三,在
RETURN
語句中指定返回值的數據類型。 - 第四,在函數主體內,必須包含一個
RETURN
語句來返回一個值。
以下示例創建一個根據數量,價格和折扣計算淨銷售額的用戶定義函數:
CREATE FUNCTION sales.udfNetSale(
@quantity INT,
@list_price DEC(10,2),
@discount DEC(4,2)
)
RETURNS DEC(10,2)
AS
BEGIN
RETURN @quantity * @list_price * (1 - @discount);
END;
稍後,可以使用它來計算示例資料庫中order_items
中任何銷售訂單的淨銷售額。
創建標量函數後,可以在:可編程性 -> 函數 -> 標量值函數 下找到它,如下圖所示:
調用標量函數
可以像調用內置函數一樣調用標量函數。 例如,以下語句演示了如何調用udfNetSale
函數:
SELECT
sales.udfNetSale(10,100,0.1) net_sale
執行上面語句,得到以下結果:
以下示例演示如何使用sales.udfNetSale
函數獲取order_items
表中銷售訂單的淨銷售額:
SELECT
order_id,
SUM(sales.udfNetSale(quantity, list_price, discount)) net_amount
FROM
sales.order_items
GROUP BY
order_id
ORDER BY
net_amount DESC;
執行上面查詢語句,得到以下結果:
修改標量函數
要修改標量函數,請使用ALTER
而不是CREATE
關鍵字。 其餘的語句保持不變:
ALTER FUNCTION [schema_name.]function_name (parameter_list)
RETURN data_type AS
BEGIN
statements
RETURN value
END
請注意,如果不存在,則可以使用CREATE OR ALTER
語句創建用戶定義的函數,或者修改現有的標量函數:
CREATE OR ALTER FUNCTION [schema_name.]function_name (parameter_list)
RETURN data_type AS
BEGIN
statements
RETURN value
END
刪除標量函數
要刪除現有標量函數,請使用DROP FUNCTION
語句:
DROP FUNCTION [schema_name.]function_name;
例如,要刪除sales.udfNetSale
函數,請使用以下語句:
DROP FUNCTION sales.udfNetSale;
SQL Server標量函數說明
以下是標量函數的一些關鍵點:
- 標量函數幾乎可以在T-SQL語句中的任何位置使用。
- 標量函數接受一個或多個參數但只返回一個值,因此,它們必須包含
RETURN
語句。 - 標量函數可以使用IF塊或WHILE迴圈等邏輯。
- 標量函數無法更新數據。可以訪問數據,但這不是一個好習慣。
- 標量函數可以調用其他函數。
在本教學中,學習了如何使用SQL Server標量函數來封裝複雜的公式或複雜的業務邏輯,並在查詢中重用它們。
上一篇:
SQL Server用戶定義函數
下一篇:
SQL Server觸發器