SQL Server標量函數

在本教學中,將瞭解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中任何銷售訂單的淨銷售額。

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觸發器