記憶體內部 OLTP 的純量使用者定義函數

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體

在 SQL Server 2016 (13.x) 中,您可建立和卸除原生編譯的純量使用者定義函數。 您亦可改變這些使用者定義函數。 原生編譯可改善 Transact-SQL 中使用者定義函數評估的效能。

若改變原生編譯的純量使用者定義函數,則在執行作業以及編譯新版本函數時仍可繼續使用應用程式。

如需了解支援的 T-SQL 結構,請參閱 原生編譯 T-SQL 模組支援的功能。

建立、卸除和改變使用者定義函數

您可以使用 CREATE FUNCTION 建立原生編譯的純量使用者自訂函式,使用 DROP FUNCTION 移除使用者自訂函式,以及使用 ALTER FUNCTION 變更函式。 使用者定義函數需要使用 BEGIN ATOMIC WITH。

如需關於支援語法與所有限制的資訊,請參閱下列主題。

sp_recompile (Transact-SQL&) 預存程序可搭配原生編譯純量使用者定義函數併用。 這將導致系統使用中繼資料中現有的定義重新編譯該函式。

下列範例展示來自 AdventureWorks2022 範例資料庫的純量 UDF。

CREATE FUNCTION [dbo].[ufnLeadingZeros_native](@Value int)   
RETURNS varchar(8)   
WITH NATIVE_COMPILATION, SCHEMABINDING  
AS   
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'English')  
  
    DECLARE @ReturnValue varchar(8);  
    SET @ReturnValue = CONVERT(varchar(8), @Value);  
       DECLARE @i int = 0, @count int = 8 - LEN(@ReturnValue)  
  
    WHILE @i < @count  
       BEGIN  
            SET @ReturnValue = '0' + @ReturnValue;  
            SET @i += 1  
       END  
  
    RETURN (@ReturnValue);  
  
END  

呼叫使用者自訂函數

原生編譯的純量使用者定義函數可用於運算式中,其使用位置與內建純量函數及解譯的純量使用者定義函數相同。 原生編譯的純量使用者定義函數,也可以在 Transact-SQL 陳述式及原生編譯的預存程序中搭配 EXECUTE 陳述式使用。

您可以在原生編譯的預存程序、原生編譯的使用者定義函數,以及任何允許使用內建函數的地方,使用這些純量使用者定義函數。 您亦可在傳統的 Transact-SQL 模組中使用原生編譯純量使用者定義函數。

只要可以使用解譯的純量使用者定義函數,您就可在 interop 模式中使用這些純量使用者定義函數。 此使用方式會受到跨容器交易限制所影響,如 Transactions with Memory-Optimized Tables (使用記憶體最佳化資料表的交易) 的 Supported Isolation Levels for Cross-Container Transactions(跨容器交易支援的隔離等級) 一節中所述。 如需 interop 模式的詳細資訊,請參閱 使用解譯的 Transact-SQL 存取記憶體最佳化的資料表。

原生編譯的純量使用者定義函數確實需要明確的執行內容。 欲了解更多資訊,請參閱 EXECUTE AS 條款(Transact-SQL)。 EXECUTE AS 不支援 CALLER。 如需詳細資訊,請參閱 EXECUTE (Transact-SQL)。

如需原生編譯的純量使用者定義函數中 Transact-SQL EXECUTE 陳述式的支援語法,請參閱 EXECUTE (Transact-SQL)。 如需了解在原生編譯的預存程序中執行使用者定義函數所支援的語法,請參閱 原生編譯 T-SQL 模組支援的功能。

提示與參數

在原生編譯的純量使用者定義函式內,對資料表、聯結和查詢提示的支援,等同於原生編譯預存程序對這些提示的支援。 與直譯型標量使用者定義函數相同,Transact-SQL 查詢中包含的查詢提示若引用原生編譯的純量使用者定義函式,不會影響該使用者定義函數的查詢計畫。

原生編譯的純量使用者定義函式所支援的參數,與原生編譯預存程序所支援的參數相同,只要這些參數也允許用於純量使用者定義函式。 資料表值參數即是受支援參數的範例。

結構描述繫結

下列項目會套用至原生編譯純量使用者定義函數。

  • 必須繫結至結構描述,方法是在 CREATE FUNCTION 和 ALTER FUNCTION 中使用 WITH SCHEMABINDING 引數。

  • 當被結構描述繫結的預存程序或使用者定義函數參考時,無法刪除或變更。

SHOWPLAN_XML

原生編譯的純量使用者定義函式支援 SHOWPLAN_XML。 它遵循一般 SHOWPLAN_XML 架構,與原生編譯的儲存程序相同。 使用者定義函數的基底項目為 <UDF>。

STATISTICS XML 不支援原生編譯的純量使用者定義函式。 當你執行查詢參考使用者定義函式(啟用 STATISTICS XML )時,回傳的 XML 內容卻沒有使用者定義函式的部分。

權限

如同原生編譯的預存程序,原生編譯的純量使用者定義函數所參考之物件的權限,會在建立函數時進行檢查。 如果冒充的使用者沒有正確的權限,該系統 CREATE FUNCTION 就會失敗。 若權限變更導致模擬使用者不再具有正確權限,則後續的使用者定義函數執行作業亦會失敗。

若您在原生編譯預存程序中使用原生編譯純量使用者定義函數,則在建立外部程序時會檢查執行使用者定義函數的權限。 由外部程序模擬的使用者若不具備使用者定義函數的 EXEC 權限,則會導致預存程序建立作業失敗。 若權限變更導致使用者不再具有 EXEC 權限,則會導致外部程序執行作業失敗。