インメモリ OLTP でのユーザー定義のスカラー関数

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

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  

ユーザー定義関数の呼び出し

ネイティブ コンパイル済みのスカラー ユーザー定義関数は、式 (組み込みスカラー関数および解釈されたスカラー ユーザー定義関数と同じ場所) に使用できます。 ネイティブ コンパイル済みのスカラー ユーザー定義関数は、EXECUTE ステートメント、Transact-SQL ステートメント、およびネイティブ コンパイル ストアド プロシージャでも使用できます。

このスカラー ユーザー定義関数は、ネイティブ コンパイル ストアド プロシージャ、ネイティブ コンパイル済みのユーザー定義関数、および組み込み関数が許可されている任意の場所で使用できます。 また、ネイティブ コンパイル済みのスカラー ユーザー定義関数は従来の Transact-SQL モジュールにも使用できます。

このスカラー ユーザー定義関数は、解釈されたスカラー ユーザー定義関数を使用できる任意の場所で相互運用モードで使用できます。 このような使用は、「 Transactions with Memory-Optimized Tables (メモリ最適化テーブルでのトランザクション) 」の「 Supported Isolation Levels for Cross-Container Transactions (複数コンテナーにまたがるトランザクションでサポートされる分離レベル)」セクションで説明されているとおり、コンテナーにまたがるトランザクションの制約に従う必要があります。 相互運用モードの詳細については、「 解釈された Transact-SQL を使用したメモリ最適化テーブルへのアクセス」を参照してください。

ネイティブ コンパイル済みのスカラー ユーザー定義関数には、明示的な実行コンテキストが必要です。 詳細については、「EXECUTE AS 句 (Transact-SQL)」を参照してください。 EXECUTE AS CALLER はサポートされていません。 詳細については、「EXECUTE (Transact-SQL)」を参照してください。

Transact-SQL 実行ステートメントおよびネイティブ コンパイル済みのスカラー ユーザー定義関数でサポートされている構文については、「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 アクセス許可がなくなった場合、外部プロシージャの実行は失敗します。

参照

組み込み関数 (Transact-SQL)
XML 形式での実行プランの保存