CREATE FUNCTION

適用於:Microsoft Fabric 中的 SQL 分析端點與 Microsoft Fabric 中的倉庫

CREATE FUNCTION 建立內嵌表值函數與純量函數。

注意

純量 UDF 是網狀架構數據倉儲中的預覽功能。

使用者定義函式是一種 Transact-SQL 例程,接受參數,執行如複雜計算等動作,並將該動作的結果以值形式回傳。 純量函式會傳回純量值,例如數位或字串。 使用者定義的數據表值函式 (TVF) 會傳回數據表。

請使用 CREATE FUNCTION 來建立一個可重複使用的 T-SQL 例程,並可用以下方式:

  • 在 Transact-SQL 陳述中,例如 SELECT
  • 在 Transact-SQL 資料操作語句(DML)中,如 UPDATEINSERTDELETE和 。
  • 在應用程式中呼叫該函式。
  • 在另一個使用者定義函數的定義中。
  • 用來取代儲存程序。

如果沒有新函式,指定 CREATE OR ALTER FUNCTION 要建立一個新函式,或在單一語句中修改現有函式。

Transact-SQL 語法慣例

語法

純量函式語法

CREATE FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ] parameter_data_type   
    [ = default ] }   
    [ ,...n ]  
  ]  
)  
RETURNS return_data_type  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    BEGIN   
        function_body   
        RETURN scalar_expression  
    END  
[ ; ]  

<function_option>::=   
{  
    [ INLINE = AUTO ]
  | [ SCHEMABINDING ]  
  | [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]  
}  

內嵌數據表值函式語法

CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
    [ = default ] }
    [ ,...n ]
  ]
)
RETURNS TABLE
    [ WITH SCHEMABINDING ]
    [ AS ]
    RETURN [ ( ] select_stmt [ ) ]
[ ; ]

引數

schema_name

使用者定義函式所屬的架構名稱。

function_name

用戶定義函數的名稱。 函式名稱必須遵循識別碼規則,並在資料庫及其結構中保持唯一。

即使你沒有指定參數,函式名稱後面也必須加上括號。

@ parameter_name

用戶定義函數中的參數。 你可以宣告一個或多個參數。

一個函數最多可包含 2,100 個參數。 當使用者或應用程式呼叫函式時,除非該參數有預設值,否則必須提供每個宣告參數的值。

使用 "at" 記號 ( @ ) 當作第一個字元來指定參數名稱。 參數名稱必須遵循識別碼的規則。 參數是函數的局部;你可以在其他函式中使用相同的參數名稱。 參數只能取代常數;它們不能取代資料表名稱、欄位名稱或其他資料庫物件名稱。

ANSI_WARNINGS 在存儲過程、使用者定義函數中傳遞參數或在 Batch 語句中聲明和設置變數時,不遵循。 例如,如果你將變數定義為 char(3),然後設定大於三個字元的值,資料就會被截斷到定義大小,SQL 陳述式就會成功。

parameter_data_type

參數數據類型。 針對 Transact-SQL 函式,允許 支援的所有純量數據類型

[ = 預設 ]

參數的預設值。 如果你定義 了預設 值,就可以執行函式而不指定該參數的值。

當函式的參數有預設值時,你必須在呼叫該函式時指定關鍵字 DEFAULT 以取得預設值。 這個行為與使用預存程序中具有預設值的參數不一樣,因為在預存程序中,省略參數也意味著使用預設值。

return_data_type

標量使用者定義函數的返回值。

對於網狀架構數據倉儲中的函式,除了 rowversion/時間戳之外,允許所有數據類型。 像 桌子 這種非純量類型是不被允許的。

function_body

一系列 Transact-SQL 語句。

在純量函式中, function_body 是一系列 Transact-SQL 語句,一起評估為純量值,其中包括:

  • 單一語句表達式
  • 多語句表示式 (IF/THEN/ELSEBEGIN/END 區塊)
  • 局部變數
  • 可用的內建 SQL 函式呼叫
  • 呼叫其他UDF
  • SELECT 語句和數據表、檢視表和內嵌數據表值函式的參考
  • 控制流程語句(WHILE 迴圈、 RETURNS

scalar_expression

指定純量函數傳回的純量值。

select_stmt

SELECT 一語句,定義內嵌數據表值函式的傳回值。 對於內嵌表值函式,則沒有函式主體;該表格是單一 SELECT 陳述的結果集合。

TABLE

指定資料表值函式 (TVF) 的傳回值是資料表。 你只能把常數和 @local_variables 傳給 TVF。

在內嵌 TVF(預覽)中,你透過單一TABLE語句定義SELECT回傳值。 內聯函數沒有關聯的 return 變數。

<function_option>

Fabric Data Warehouse中,ENCRYPTIONEXECUTE AS 關鍵字不支援。

支援的功能選項包括:

直列 = 自動

規定是否可以建立或修改純量使用者定義函數,而不考慮內嵌需求。 該 INLINE 條款為可選條款。 對於可線化標量 UDF,指定 INLINE = AUTO 不會改變其線化性或執行行為。

SCHEMABINDING

指定函數必須繫結到它所參考的資料庫物件。 當你指定 SCHEMABINDING時,你無法修改底層物件(例如視圖或資料表),以影響函式定義的方式。 你必須先修改或刪除函式定義,以移除對你想修改物件的依賴。

只有在下發生下列其中一個動作時,才會移除函數與其參考的物件之間的繫結:

  • 你去掉這個函數。

  • ALTER輸入函式陳述,然後移除選項。SCHEMABINDING

只有當以下條件成立時,函式才能進行結構綁定:

  • 函式所參考的任何使用者定義函式也是結構綁定的。

  • 函式透過兩部分名稱來參考物件。

  • 在 UDF 主體中,你只能參考內建函式和其他 UDF 在同一資料庫中。

  • 執行該 CREATE FUNCTION 語句的使用者對函式所參考的資料庫物件擁有 REFERENCES 權限。

若要移除 SCHEMABINDING,請使用 ALTER

傳回 NULL 輸入上的 NULL | 在 NULL 輸入上呼叫

指定 OnNULLCall 純量值函式的屬性。 如果你沒有指定這個屬性, CALLED ON NULL INPUT 預設是隱含的,即使以參數形式傳遞,函式本體仍會 NULL 執行。

最佳做法

這很重要

在Fabric Data Warehouse中,純量 UDF 必須是可列起的,才能用於SELECT ... FROM使用者資料表上的查詢,但你仍然可以透過指定WITH INLINE = AUTO函式選項來建立非內聯的函式。 非線化的純量 UDF 在有限的情境下有效。 您可以檢查 是否可以內嵌 UDF

  • 如果你沒有建立帶有結構綁定的使用者自訂函式,底層物件的變更會影響函式的定義,並在呼叫該函式時產生意想不到的結果。 當你指定 WITH SCHEMABINDING 建立函式的時間時,你確保後續對底層物件的變更不會改變或破壞函式的行為。

  • 把你的使用者自訂函式寫成可內列化。 欲了解更多關於內嵌概念的資訊,請參見 純量 UDF 的內聯。 關於如何讓純量 UDF 可線列的範例,請參見 Microsoft Fabric Data Warehouse 中建立純量 UDF

互通性

內嵌數據表值使用者定義函式

內嵌表格值函式只接受單一 SELECT 陳述。

純量使用者定義函式

中繼資料

此小節列出您可以用來傳回使用者定義函式之中繼資料的系統目錄檢視表。

  • sys.sql_modules:顯示 Transact-SQL 使用者自訂函式的定義,以及可線上性資訊。 例如:

      SELECT 
          SCHEMA_NAME(o.schema_id) AS SchemaName,
          o.name AS FunctionName,
          m.definition AS FunctionDefinition,
          m.is_inlineable AS Inlineable,
          m.inline_eligibility_mask AS InlineEligibilityMask
      FROM sys.objects o
      JOIN sys.sql_modules m ON o.object_id = m.object_id
      WHERE o.type = 'FN';
    
  • sys.parameters:顯示使用者定義函式中定義之參數的相關信息。

  • sys.sql_expression_dependencies:顯示函式所參考的基礎物件。

權限

網狀架構工作區管理員、成員和參與者角色的成員可以建立函式。

純量 UDF 的內嵌

Microsoft Fabric Data Warehouse 採用不同的內嵌技術,以分散式方式編譯並執行使用者定義的程式碼。

標量 UDF 的內嵌預設是啟用的。

某些 T-SQL 語法會使純量 UDF 不可內嵌。 例如,包含迴圈組合 WHILE 且參考 UDF 主體內的表格的函式,無法被內聯化。

檢查純量 UDF 是否可以內嵌

目錄 sys.sql_modules 檢視包含 資料行 is_inlineable,指出UDF是否可內嵌。 這個 is_inlineable 屬性來自於檢查 UDF 定義中的語法。 純量 UDF 僅在編譯時內嵌。

inline_eligibility_mask該性質說明了適用於 UDF 的哪種內嵌方式。

  • 值 表示 0 UDF 不是線列的。
  • 值 表示 1 UDF 有資格進行 純量 UDF 內嵌
  • 2 為表示 UDF 有資格透過表達式區塊內嵌。
  • 3 表示 UDF 符合任一內嵌技術。

注意

表達式區塊內嵌是一種為資料倉儲規模工作負載設計的技術。

Warning

如果一個純量 UDF 僅透過純量 UDF 內聯即可內勾,並不能保證在編譯查詢時它總是內嵌的。

使用下列範例查詢來檢查純量 UDF 是否可內嵌:

SELECT 
SCHEMA_NAME(b.schema_id) as function_schema_name,
    b.name as function_name,
       b.type_desc as function_type,
       a.is_inlineable
FROM sys.sql_modules AS a
     INNER JOIN sys.objects AS b
         ON a.object_id = b.object_id
WHERE b.type IN ('FN');

如果純量函數在 中 sys.sql_modules.is_inlineable無法內列化,你仍然可以將查詢當作獨立呼叫執行,例如設定變數。 標量函數不能成為使用者資料表查詢的一部分 SELECT ... FROM 。 例如:

CREATE FUNCTION [dbo].[custom_SYSUTCDATETIME]()
  RETURNS datetime2(6)
  AS
  BEGIN
   RETURN SYSUTCDATETIME();
  END

樣本dbo.custom_SYSUTCDATETIME純量使用者定義函數不可線化,因為它使用非確定性系統函數。 SYSUTCDATETIME() 當它用於 SELECT ... FROM 使用者資料表的查詢時會失敗,但作為獨立呼叫則成功。 例如:

DECLARE @utcdate datetime2(7);
SET @utcdate = dbo.custom_SYSUTCDATETIME();
SELECT @utcdate as 'utc_date';

限制

注意

純量 UDF 是網狀架構數據倉儲中的預覽功能。 在目前的預覽期間,限制可能會變更。

  • 當在任何不支援的情境中使用純量 UDF 時,你會在查詢執行時看到錯誤訊息 Scalar UDF execution is currently unavailable in this context.

  • 當以下情況,無法透過 表達式區塊 內襯標量 UDF :

  • 在以下條件下,標量UDF無法被內線化。

    • 當純量 UDF 實體包含 WHILE 迴圈或 BREAKCONTINUE 語句時,無法透過純量 UDF 內嵌來內襯。
    • 當純量 UDF 主體包含多個 RETURN 陳述時,無法透過純量 UDF 內襯來內襯。
    • 當純量 UDF 實體包含時間依賴的內建函數(如 GETDATE())。 如需詳細資訊,請參閱確定性與非確定性函式
    • 當純量 UDF 實體包含 STRING_AGG 函數JSON_ARRAYAGG 函數或其他 系統函數時,則無法透過純量 UDF 內線化來內嵌。
    • 你可以巢狀使用者自訂函式。 也就是說,一個使用者定義的函數可以呼叫另一個。 當被呼叫函式開始執行時,巢狀層級會遞增;當被呼叫函式執行結束時,巢狀層級則遞減。 在 Fabric Data Warehouse 中,當 UDF 主體參考表格、檢視或內嵌表值函式時,你可以將使用者定義函式巢狀至最多四層,否則最多可巢狀 32 層。 若超過巢狀結構的最大層級,呼叫函式鏈將失敗。
    • 如需詳細資訊,請參閱 純量 UDF 內嵌需求
  • 標量 UDF 無法適用於所有查詢形狀,視適用的內嵌技術而定。

    • 對於純量 UDF 內嵌:
      • 純量 UDF 不能用於 GROUP BYORDER BY
      • 標量UDF不能與CTE合併使用。
      • 若單一查詢中超過 10 次 UDF 呼叫,使用者查詢可能會失敗。
  • 在Fabric Data Warehouse中,標量 UDF 不能用於 ROLLUPCUBEGROUPING SETS

Warning

若查詢包含多個純量 UDF,且至少有一個依賴純量 UDF 內嵌,則整個查詢必須符合純量 UDF 內聯要求。

範例

A。 建立內嵌數據表值函式

以下範例建立一個內嵌的表格值函式,透過參數過濾 objectType 模組的鑰匙資訊。 它預設值是呼叫帶有 DEFAULT 參數的函式時回傳所有模組。 此範例使用了元 資料中提及的一些系統目錄檢視。

CREATE FUNCTION dbo.ModulesByType (@objectType CHAR(2) = '%%')
RETURNS TABLE
AS
RETURN (
        SELECT sm.object_id AS 'Object Id',
            o.create_date AS 'Date Created',
            OBJECT_NAME(sm.object_id) AS 'Name',
            o.type AS 'Type',
            o.type_desc AS 'Type Description',
            sm.DEFINITION AS 'Module Description',
            sm.is_inlineable AS 'Inlineable'
        FROM sys.sql_modules AS sm
        INNER JOIN sys.objects AS o ON sm.object_id = o.object_id
        WHERE o.type LIKE '%' + @objectType + '%'
        );
GO

呼叫回傳所有內嵌表值函式(IF):

SELECT * FROM dbo.ModulesByType('IF'); -- SQL_INLINE_TABLE_VALUED_FUNCTION

或者,尋找所有純量函式 (FN):

SELECT * FROM dbo.ModulesByType('FN'); -- SQL_SCALAR_FUNCTION

B. 合併內嵌數據表值函式的結果

這個簡單的範例使用先前建立的內嵌 TVF 來示範如何透過使用 CROSS APPLY。 在這裡,你從兩個sys.objects欄位中選取所有欄位,並選取該欄位中所有相符ModulesByType資料列的結果type。 欲了解更多使用 APPLY,請參閱 FROM 子句加上 JOIN, APPLY, PIVOT (Transact-SQL)

SELECT * 
FROM sys.objects AS o
CROSS APPLY dbo.ModulesByType(o.type);
GO

C. 建立純量 UDF 函式

下列範例會建立可內嵌的純量 UDF,以遮罩輸入文字。

CREATE OR ALTER FUNCTION [dbo].[cleanInput] (@InputString VARCHAR(100))
    RETURNS VARCHAR(50)
    AS
    BEGIN
        DECLARE @Result VARCHAR(50);
        DECLARE @CleanedInput VARCHAR(50);

        -- Trim whitespace
        SET @CleanedInput = LTRIM(RTRIM(@InputString));

        -- Handle empty or null input
        IF @CleanedInput = '' OR @CleanedInput IS NULL
        BEGIN
            SET @Result = '';
        END
        ELSE IF LEN(@CleanedInput) <= 2
        BEGIN
            -- If string length is 1 or 2, just return the cleaned string
            SET @Result = @CleanedInput;
        END
        ELSE
        BEGIN
            -- Construct the masked string
            SET @Result = 
                LEFT(@CleanedInput, 1) +
                REPLICATE('*', LEN(@CleanedInput) - 2) +
                RIGHT(@CleanedInput, 1);
        END

        RETURN @Result
    END

您可以像這樣呼叫 函式:

DECLARE @input varchar(100) = '123456789';

SELECT dbo.cleanInput (@input) AS function_output;

在網狀架構數據倉儲中使用純量 UDF 的更多範例:

SELECT在 語句中:

SELECT TOP 10 
t.id, t.name, 
dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t;

WHERE在 子句中:

 SELECT t.id, t.name, dbo.cleanInput(t.name) AS function_output
FROM dbo.MyTable AS t
WHERE dbo.cleanInput(t.name)='myvalue';

JOIN在 子句中:

SELECT t1.id, t1.name, 
     dbo.cleanInput (t1.name) AS function_output, 
     dbo.cleanInput (t2.name) AS function_output_2
FROM dbo.MyTable1 AS t1
    INNER JOIN dbo.MyTable2 AS t2 
        ON dbo.cleanInput(t1.name)=dbo.cleanInput(t2.name);

ORDER BY在 子句中:

SELECT  t.id, t.name, dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t
ORDER BY function_output;

在資料作語言 (DML) 語句中, 例如 INSERTUPDATEDELETE

SELECT t.id, t.name, dbo.cleanInput (t.name) AS function_output 
INTO dbo.MyTable_new
FROM dbo.MyTable AS t;

UPDATE t
SET t.mycolumn_new = dbo.cleanInput (t.name)
FROM dbo.MyTable AS t;

DELETE t
FROM dbo.MyTable AS t
WHERE dbo.cleanInput (t.name) ='myvalue';

適用於:Azure Synapse Analytics

在 Azure Synapse Analytics 中建立一個用戶定義函數(UDF)。 使用者定義函數是一種 Transact-SQL 常式,它會接受參數、執行動作 (例如複雜計算) 並且將該動作的結果傳回成值。 .使用者定義的資料表值函數 (TVF) 會傳回 table 資料類型。

小提示

關於 Fabric Data Warehouse 的語法,請參見 for CREATE FUNCTION Fabric Data Warehouse 的版本。

  • 在 Azure Synapse Analytics 中, CREATE FUNCTION 可以使用內嵌數據表值函式的語法傳回數據表(預覽),也可以使用純量函式的語法傳回單一值。

  • 在 Azure Synapse Analytics 中的無伺服器 SQL 集區中,可以建立內嵌數據表值函式, CREATE FUNCTION 但不能建立純量函式。

    請使用此陳述建立一個可重複使用的例行程序,並以以下方式使用:

  • 在 Transact-SQL 語句中,例如 SELECT

  • 在調用函數

  • 在另一個使用者自訂函數的定義中

  • 若要在資料行上定義 CHECK 條件約束

  • 取代預存程序

  • 使用內嵌函式作為安全性原則的篩選述詞

Transact-SQL 語法慣例

語法

純量函式語法

-- Transact-SQL Scalar Function Syntax (in dedicated pools in Azure Synapse Analytics)
-- Not available in the serverless SQL pools in Azure Synapse Analytics

CREATE FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ] parameter_data_type   
    [ = default ] }   
    [ ,...n ]  
  ]  
)  
RETURNS return_data_type  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    BEGIN   
        function_body   
        RETURN scalar_expression  
    END  
[ ; ]  

<function_option>::=   
{  
    [ SCHEMABINDING ]  
  | [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]  
}  

內嵌數據表值函式語法

-- Transact-SQL Inline Table-Valued Function Syntax
-- Preview in dedicated SQL pools in Azure Synapse Analytics
-- Available in the serverless SQL pools in Azure Synapse Analytics
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
    [ = default ] }
    [ ,...n ]
  ]
)
RETURNS TABLE
    [ WITH SCHEMABINDING ]
    [ AS ]
    RETURN [ ( ] select_stmt [ ) ]
[ ; ]

引數

schema_name

使用者定義函式所屬的架構名稱。

function_name

用戶定義函數的名稱。 函式名稱必須遵循識別碼規則,並在資料庫及其結構中保持唯一。

注意

即使你沒有指定參數,函式名稱後面也必須加上括號。

@ parameter_name

用戶定義函數中的參數。 你可以宣告一個或多個參數。

一個函數最多可包含 2,100 個參數。 當使用者或應用程式呼叫函式時,除非該參數有預設值,否則必須提供每個宣告參數的值。

使用 "at" 記號 ( @ ) 當作第一個字元來指定參數名稱。 參數名稱必須遵循識別碼的規則。 參數是函數的局部;你可以在其他函式中使用相同的參數名稱。 參數只能取代常數;它們不能取代資料表名稱、欄位名稱或其他資料庫物件名稱。

注意

ANSI_WARNINGS 在存儲過程、使用者定義函數中傳遞參數或在 Batch 語句中聲明和設置變數時,不遵循。 例如,如果你將變數定義為 char(3),然後設定為大於三個字元的值,資料就會被截斷到定義大小,或 INSERT (or UPDATE )陳述句就會成功。

parameter_data_type

參數數據類型。 針對 Transact-SQL 函數,會允許 Azure Synapse Analytics 中支援的所有純量資料類型。 時間戳(rowversion)資料型別不被支援。

[ = 預設 ]

參數的預設值。 如果你定義 了預設 值,就可以執行函式而不指定該參數的值。

當函式的參數有預設值時,你必須在呼叫該函式時指定關鍵字 DEFAULT 以取得預設值。 這個行為與使用預存程序中具有預設值的參數不一樣,因為在預存程序中,省略參數也意味著使用預設值。

return_data_type

標量使用者定義函數的返回值。 針對 Transact-SQL 函數,會允許 Azure Synapse Analytics 中支援的所有純量資料類型。 rowversion/timestamp 資料型別不被支援。 游標和表格非純量類型是不被允許的。

function_body

Transact-SQL 陳述式系列。 function_body不能包含SELECT語句,也不能參考資料庫資料。 function_body無法參考資料表或檢視。 函數本體可以呼叫其他確定性函數,但無法呼叫非確定性函式。

在純量函式中,function_body 是一系列的 Transact-SQL 陳述式,這些陳述式會一起評估為純量值。

scalar_expression

指定純量函數傳回的純量值。

select_stmt

SELECT 一語句,定義內嵌數據表值函式的傳回值。 對於內嵌表值函式,則沒有函式主體;該表格是單一 SELECT 陳述的結果集合。

TABLE

指定資料表值函式 (TVF) 的傳回值是資料表。 你只能把常數和 @local_variables 傳給 TVF。

在內嵌 TVF(預覽)中,你透過單一TABLE語句定義SELECT回傳值。 內聯函數沒有關聯的 return 變數。

<function_option>

指定函式具有下列一或多個選項。

SCHEMABINDING

指定函數必須繫結到它所參考的資料庫物件。 當你指定 SCHEMABINDING時,你無法修改底層物件(例如視圖或資料表),以影響函式定義的方式。 你必須先修改或刪除函式定義,以移除對你想修改物件的依賴。

只有在下發生下列其中一個動作時,才會移除函數與其參考的物件之間的繫結:

  • 你去掉這個函數。

  • ALTER輸入函式陳述,然後移除選項。SCHEMABINDING

只有當以下條件成立時,函式才能進行結構綁定:

  • 函式所參考的任何使用者定義函式也是結構綁定的。

  • 函式參考使用單部分或兩部分名稱。

  • 在 UDF 主體中,你只能參考內建函式和其他 UDF 在同一資料庫中。

  • 執行該 CREATE FUNCTION 語句的使用者對函式所參考的資料庫物件擁有 REFERENCES 權限。

若要移除 SCHEMABINDING,請使用 ALTER

傳回 NULL 輸入上的 NULL | 在 NULL 輸入上呼叫

指定 OnNULLCall 純量值函式的屬性。 如果你沒有指定這個屬性, CALLED ON NULL INPUT 預設是隱含的,即使以參數形式傳遞,函式本體仍會 NULL 執行。

最佳做法

如果你沒有用 SCHEMABINDING 子句建立使用者定義函式,底層物件的變更可能會影響函式的定義,並在呼叫時造成意想不到的結果。 建立函式時請指定子句。WITH SCHEMABINDING 這個子句確保你無法修改函式定義中提到的物件,除非你同時修改函式。

互通性

以下是純量值函式中的有效陳述式:

  • 指派陳述式。

  • 控制流程語句,除了 TRY...CATCH 聲明。

  • 定義本地資料變數的 DECLARE 陳述式。

在內嵌表格值函式(預覽)中,你只能使用單一的 select 語句。

限制

你不能用使用者自訂函式來執行修改資料庫狀態的動作。

你可以巢狀使用者自訂函式。 一個使用者定義的函式可以呼叫另一個。 當被呼叫函式開始執行時,巢狀層級會遞增;當被呼叫函式執行結束時,巢狀層級則遞減。 如果你超過巢狀結構的最大層級,整個呼叫函式鏈就會失敗。

你無法在 master Azure Synapse Analytics 的無伺服器 SQL 池資料庫中建立物件,包括函式。

中繼資料

此小節列出您可以用來傳回使用者定義函式之中繼資料的系統目錄檢視表。

  • sys.sql_modules:顯示 Transact-SQL 用戶定義函式的定義。 例如:

    SELECT definition, type   
    FROM sys.sql_modules AS m  
    JOIN sys.objects AS o   
        ON m.object_id = o.object_id   
        AND type = ('FN');
    
  • sys.parameters:顯示使用者定義函式中定義之參數的相關信息。

  • sys.sql_expression_dependencies:顯示函式所參考的基礎物件。

權限

需要 CREATE FUNCTION 在資料庫中取得權限,並對建立函式的結構取得 ALTER 權限。

範例

A。 使用純量值使用者定義函數來變更數據類型

這個簡單的函式以 整數 資料型態為輸入,並回傳一個十 進位(10,2) 資料型態作為輸出。

CREATE FUNCTION dbo.ConvertInput (@MyValueIn int)  
RETURNS decimal(10,2)  
AS  
BEGIN
    DECLARE @MyValueOut int;  
    SET @MyValueOut= CAST( @MyValueIn AS decimal(10,2));  
    RETURN(@MyValueOut);  
END;  
GO  

SELECT dbo.ConvertInput(15) AS 'ConvertedValue';  

注意

純量函式在無伺服器 SQL 池中沒有。

B. 建立內嵌數據表值函式

以下範例建立一個內嵌的表格值函式,透過參數過濾 objectType 模組的鑰匙資訊。 它預設值是呼叫帶有 DEFAULT 參數的函式時回傳所有模組。 此範例使用了元 資料中提及的一些系統目錄檢視。

CREATE FUNCTION dbo.ModulesByType(@objectType CHAR(2) = '%%')
RETURNS TABLE
AS
RETURN
(
    SELECT 
        sm.object_id AS 'Object Id',
        o.create_date AS 'Date Created',
        OBJECT_NAME(sm.object_id) AS 'Name',
        o.type AS 'Type',
        o.type_desc AS 'Type Description', 
        sm.definition AS 'Module Description'
    FROM sys.sql_modules AS sm  
    JOIN sys.objects AS o ON sm.object_id = o.object_id
    WHERE o.type like '%' + @objectType + '%'
);
GO

你可以呼叫回傳所有 view (V) 物件的函式,並包含:

select * from dbo.ModulesByType('V');

注意

內嵌資料表值函式可在無伺服器 SQL 池中使用,但預覽版則可在專用 SQL 池中提供。

C. 合併內嵌數據表值函式的結果

這個簡單的範例使用先前建立的內嵌 TVF 來示範如何透過使用 CROSS APPLY。 在這個例子中,你從兩個sys.objects欄位中選取所有欄位,並選取該欄位上所有相符ModulesByType資料的結果type。 欲了解更多使用 APPLY,請參閱 FROM 子句加上 JOIN, APPLY, PIVOT (Transact-SQL)

SELECT * 
FROM sys.objects o
CROSS APPLY dbo.ModulesByType(o.type);
GO

注意

內嵌資料表值函式可在無伺服器 SQL 池中使用,但預覽版則可在專用 SQL 池中提供。

後續步驟