適用於:Microsoft Fabric 中的 SQL 分析端點與 Microsoft Fabric 中的倉庫
CREATE FUNCTION 建立內嵌表值函數與純量函數。
注意
純量 UDF 是網狀架構數據倉儲中的預覽功能。
使用者定義函式是一種 Transact-SQL 例程,接受參數,執行如複雜計算等動作,並將該動作的結果以值形式回傳。 純量函式會傳回純量值,例如數位或字串。 使用者定義的數據表值函式 (TVF) 會傳回數據表。
請使用 CREATE FUNCTION 來建立一個可重複使用的 T-SQL 例程,並可用以下方式:
- 在 Transact-SQL 陳述中,例如
SELECT。 - 在 Transact-SQL 資料操作語句(DML)中,如
UPDATE、INSERT、DELETE和 。 - 在應用程式中呼叫該函式。
- 在另一個使用者定義函數的定義中。
- 用來取代儲存程序。
如果沒有新函式,指定 CREATE OR ALTER FUNCTION 要建立一個新函式,或在單一語句中修改現有函式。
語法
純量函式語法
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/ELSE和BEGIN/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中,ENCRYPTION和 EXECUTE 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 陳述。
純量使用者定義函式
非線列函式不能用於
SELECT ... FROM使用者資料表的查詢中。以下是純量值函式中的有效陳述式:
- 指派陳述式。
- 除了和
GOTO陳述之外,控制流程陳述TRY...CATCH句。 -
DECLARE定義本地資料變數的語句。 - 呼叫內建函式。
- 參考表/視圖/iTVF/其他純量 UDF。
DML 陳述句不允許出現在純量使用者定義函式中。
純量值函式主體不支援下列內建函式:
中繼資料
此小節列出您可以用來傳回使用者定義函式之中繼資料的系統目錄檢視表。
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 的哪種內嵌方式。
- 值 表示
0UDF 不是線列的。 - 值 表示
1UDF 有資格進行 純量 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 主體包含對表格/視圖/iTVF 的參考時,無法透過表達式區塊內嵌標量 UDF。
- 當標量 UDF 主體包含相同或其他標量 UDF 的參考時,無法透過表達區塊內嵌標量 UDF。
- 當純量 UDF 實體包含時間依賴的內建函數(如
GETDATE())。 如需詳細資訊,請參閱確定性與非確定性函式。 - 當純量 UDF 主體包含 AI 功能、 聚合功能、 JSON_ARRAYAGG 功能、 元資料功能、 安全功能或其他 系統功能時,無法透過表達式區塊內嵌標量 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 內嵌:
- 純量 UDF 不能用於
GROUP BY和ORDER BY。 - 標量UDF不能與CTE合併使用。
- 若單一查詢中超過 10 次 UDF 呼叫,使用者查詢可能會失敗。
- 純量 UDF 不能用於
- 對於純量 UDF 內嵌:
在Fabric Data Warehouse中,標量 UDF 不能用於
ROLLUP、CUBE或GROUPING 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) 語句中, 例如 INSERT、 UPDATE或 DELETE:
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 中建立一個用戶定義函數(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 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 池中提供。