共用方式為


建立函數

適用於:Microsoft Fabric 中的 SQL 分析端點和倉儲

CREATE FUNCTION 可以建立內嵌數據表值函式和純量函式。

注意

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

這很重要

在網狀架構數據倉儲中, 純量 UDF 必須內嵌 才能與用戶數據表上的查詢搭配 SELECT ... FROM 使用,但您仍然可以建立無法內嵌的函式。 在有限的案例中,無法內嵌工作的純量 UDF。 您可以檢查 是否可以內嵌 UDF

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

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

  • 在 Transact-SQL 語句中,例如 SELECT
  • 在 Transact-SQL 數據作語句中,例如 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>::=   
{  
    [ 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 當您在預存程式、使用者定義函式中傳遞參數,或在批次語句中宣告和設定變數時,則不會接受。 例如,如果將變數定義為 char(3) ,然後設定為大於三個字元的值,資料就會被截斷成定義的大小,而 INSERT 或 UPDATE 陳述式會執行成功。

parameter_data_type

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

[ = 預設 ]

參數的預設值。 如果已定義 default 值,則不需為該參數指定值,即可執行函式。

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

return_data_type

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

對於網狀架構數據倉儲中的函式,除了 rowversion/時間戳之外,允許所有數據類型。 不允許使用 數據表 之類的非Calar 類型。

function_body

一系列 Transact-SQL 語句。

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

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

scalar_expression

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

select_stmt

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

表格

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

在內嵌TVF中,TABLE 傳回值是透過單 SELECT 一語句來定義。 內嵌函數沒有相關聯的傳回變數。

<function_option>

在網狀架構數據倉儲中 INLINE,不支援 、 ENCRYPTIONEXECUTE AS 關鍵詞。

支援的函式選項包括:

SCHEMABINDING

指定函數必須繫結到它所參考的資料庫物件。 當指定 SCHEMABINDING 時,無法依照會影響函數定義的方式來修改基底物件。 您必須先修改或卸除函數定義才能移除對於要修改之物件的相依性。

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

  • 已卸除這個函數。

  • 您可以利用未指定 SCHEMABINDING 選項的 ALTER 陳述式來修改函數。

只有當下列條件成立時,函數才可繫結結構描述:

  • 函式參考的任何使用者定義函式也繫結結構描述。

  • 函數引用的物件使用由兩部分組成的名稱進行引用。

  • 僅有內建函式以及相同資料庫中的其他 UDF 可以在 UDF 的主體內參考。

  • 執行 CREATE FUNCTION 語句的使用者具有函式所參考之資料庫物件的 REFERENCES 許可權。

若要移除 SCHEMABINDING,請使用 ALTER

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

指定 OnNULLCall 純量值函式的屬性。 如果未指定, CALLED ON NULL INPUT 則預設為隱含,即使 NULL 傳遞為自變數,函式主體也會執行。

最佳做法

  • 如果未使用 schemabinding 建立使用者定義的函式,對基礎物件所做的變更可能會影響函式的定義,並在叫用函式時產生非預期的結果。 建議您在建立函式時指定 WITH SCHEMABINDING 子句。 這可以確保系統無法修改函數定義中參考的物件 (除非同時修改函數)。

  • 撰寫要內嵌的使用者定義函式。 如需詳細資訊,請參閱純量 UDF 內嵌

互通性

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

在內嵌數據表值函式中,只允許單一 select 語句。

純量使用者定義函式

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

    • 工作分派語句
    • 流程控制語句除外TRY...CATCH
    • DECLARE 定義本機數據變數的語句
  • 純量值函式主體不支援下列內建函式:

  • 在下列情況下,無法在使用者數據表上的查詢中使用 SELECT ... FROM 純量 UDF:

  • 純量 UDF 無法在下列情況下用於查詢:

  • 不支援遞歸純量 UDF。

  • 如果在單一查詢中呼叫超過 10 個 UDF 呼叫,使用者查詢可能會失敗。

  • 在某些情況下,用戶查詢和UDF主體的複雜度會防止內嵌,在此情況下不會內嵌純量UDF,而且使用者查詢會失敗。

  • 在任何不支援的案例中使用純量 UDF 時,您會看到錯誤訊息 “Scalar UDF execution is currently unavailable in this context.

限制

注意

在目前的預覽期間,限制可能會變更。

使用者定義函數不能用來執行修改資料庫狀態的動作。

使用者定義函數可以具有巢狀結構;也就是說,某個使用者定義函數可以呼叫另一個使用者定義函數。 被呼叫的函數開始執行時,巢狀層級會遞增;被呼叫的函數完成執行時,巢狀層級會遞減。 當UDF主體參考數據表/檢視/內嵌數據表值函式,或最多32個層級時,網狀架構數據倉儲中的使用者定義函式最多可以巢狀化為四個層級。 超過巢狀層級上限會導致呼叫函式鏈結失敗。

中繼資料

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

  • 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:顯示函式所參考的基礎物件。

權限

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

純量 UDF 內嵌

Microsoft網狀架構數據倉儲會使用 純量 UDF 內嵌 ,以分散式方式編譯和執行使用者定義的程序代碼。 預設會啟用純量 UDF 內嵌。

雖然純量 UDF 內嵌是在 SQL Server 2019 (15.0) Microsoft引進的效能優化技術,但在網狀架構數據倉儲中,它會決定支援的案例集。 在網狀架構數據倉儲中,純量 UDF 會自動轉換成純量表達式或純量子查詢,以取代呼叫查詢來取代 UDF 運算符。

某些 T-SQL 語法會使純量 UDF 不可內嵌。 包含 WHILE 迴圈、多個 RETURN 語句或呼叫非決定性 SQL 內建函式的函式(例如 GETUTCDATE()GETDATE()) 無法內嵌。 如需詳細資訊,請參閱 純量 UDF 內嵌需求

檢查純量 UDF 是否可以內嵌

目錄 sys.sql_modules 檢視包含 資料行 is_inlineable,指出UDF是否可內嵌。

屬性 is_inlineable 衍生自檢查 UDF 定義內的語法。 在編譯時間之前,純量 UDF 不會內嵌。 的值 1 表示 UDF 是可內嵌的,而的值 0 則表示它不可內嵌。 如果純量 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

由於使用不具決定性的系統SYSUTCDATETIME()函式,範例dbo.custom_SYSUTCDATETIME純量使用者定義函式無法內嵌。 在用戶數據表的查詢中使用 SELECT ... FROM 時,它會失敗,但會成功作為獨立呼叫,例如:

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

範例

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數據行上type相符的所有數據列選取所有數據行,以及的結果ModulesByType。 如需使用 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 AnalyticsAnalytics Platform System (PDW)

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

  • 在 Analytics Platform System (PDW),傳回值必須為純量 (單一) 值。

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

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

    您可以使用這個陳述式來建立可用下列方式使用的可重複使用常式:

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

  • 在呼叫函數的應用程式中

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

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

  • 取代預存程序

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

小提示

如需網狀架構數據倉儲中的語法,請參閱適用於Microsoft網狀架構數據倉儲的 CREATE FUNCTION 版本。

Transact-SQL 語法慣例

語法

純量函式語法

-- Transact-SQL Scalar Function Syntax (in dedicated pools in Azure Synapse Analytics and Parallel Data Warehouse)
-- 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 當您在預存程式、使用者定義函式中傳遞參數,或在批次語句中宣告和設定變數時,則不會接受。 例如,如果將變數定義為 char(3) ,然後設定為大於三個字元的值,資料就會被截斷成定義的大小,而 INSERT 或 UPDATE 陳述式會執行成功。

parameter_data_type

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

[ = 預設 ]

參數的預設值。 如果已定義 default 值,則不需為該參數指定值,即可執行函式。

如果函數的參數有預設值,則必須在呼叫函數來擷取該預設值時指定關鍵字 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 一語句的結果集。

表格

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

在內嵌TVF中,TABLE 傳回值是透過單 SELECT 一語句來定義。 內嵌函數沒有相關聯的傳回變數。

<function_option>

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

SCHEMABINDING

指定函數必須繫結到它所參考的資料庫物件。 當指定 SCHEMABINDING 時,無法依照會影響函數定義的方式來修改基底物件。 您必須先修改或卸除函數定義才能移除對於要修改之物件的相依性。

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

  • 已卸除這個函數。

  • 您可以利用未指定 SCHEMABINDING 選項的 ALTER 陳述式來修改函數。

只有當下列條件成立時,函數才可繫結結構描述:

  • 函式參考的任何使用者定義函式也繫結結構描述。

  • 函式和函式所參考的其他 UDF 會使單一部分或兩部分名稱進行參考。

  • 僅有內建函式以及相同資料庫中的其他 UDF 可以在 UDF 的主體內參考。

  • 執行 CREATE FUNCTION 語句的使用者具有函式所參考之資料庫物件的 REFERENCES 許可權。

若要移除 SCHEMABINDING,請使用 ALTER

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

指定 OnNULLCall 純量值函式的屬性。 如果未指定, CALLED ON NULL INPUT 則預設為隱含,即使 NULL 傳遞為自變數,函式主體也會執行。

最佳做法

如果未以 SCHEMABINDING 子句建立使用者定義函數,叫用該函數時,對基礎物件所進行的變更可能會影響函數的定義並產生非預期的結果。 建議您在建立函式時指定 WITH SCHEMABINDING 子句。 這可以確保系統無法修改函數定義中參考的物件 (除非同時修改函數)。

互通性

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

  • 指派陳述式。

  • 流程控制陳述式 (但不包括 TRY...CATCH 陳述式)。

  • DECLARE 陳述式 - 定義區域資料變數。

在內嵌資料表值函式 (預覽) 中,僅允許單一 SELECT 陳述式。

限制

使用者定義函數不能用來執行修改資料庫狀態的動作。

使用者定義函數可以具有巢狀結構;也就是說,某個使用者定義函數可以呼叫另一個使用者定義函數。 被呼叫的函數開始執行時,巢狀層級會遞增;被呼叫的函數完成執行時,巢狀層級會遞減。 超過巢狀層級上限會導致整個呼叫函數鏈結失敗。 在Microsoft網狀架構數據倉儲中,用戶定義函式最多可以巢狀化為五個層級。

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

中繼資料

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

  • 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。 使用純量值使用者定義函數來變更數據類型

這個簡單的函式會採用 int 資料類型作為輸入,並傳回 decimal(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

接著可以呼叫 函式,以傳回所有檢視物件V::

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

注意

內嵌資料表值函數可在無伺服器 SQL 集區中使用,但在專用 SQL 集區中處於預覽。

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

這個簡單的範例會使用先前所建立的內嵌 TVF,示範如何使用 CROSS APPLY 將其結果與其他資料表合併。 在這裡,我們會針對sys.objects數據行上type相符的所有數據列選取所有數據行,以及的結果ModulesByType。 如需使用 apply 的詳細資訊,請參閱 FROM 子句加上 JOIN、APPLY、PIVOT (Transact-SQL)

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

注意

內嵌資料表值函數可在無伺服器 SQL 集區中使用,但在專用 SQL 集區中處於預覽。

後續步驟