インメモリ OLTP でのユーザー定義のスカラー関数Scalar User-Defined Functions for In-Memory OLTP

適用対象: ○SQL Server ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

SQL Server 2016 (13.x)SQL Server 2016 (13.x)で、ネイティブ コンパイル済みのスカラー ユーザー定義関数を作成および削除できます。In SQL Server 2016 (13.x)SQL Server 2016 (13.x), you can create and drop natively compiled, scalar user-defined functions. これらのユーザー定義関数を変更することもできます。You can also alter these user-defined functions. ネイティブ コンパイルでは、Transact-SQL でのユーザー定義関数の評価のパフォーマンスが向上します。Native compilation improves performance of the evaluation of user-defined functions in Transact-SQL.

ネイティブ コンパイル済みのスカラー ユーザー定義関数を変更する際には、操作が実行されて新しいバージョンの関数がコンパイルされる間、アプリケーションを引き続き使用できます。When you alter a natively compiled, scalar user-defined function, the application remains available while the operation is being run and the new version of the function is being compiled.

サポートされている T-SQL 構造については、「 ネイティブ コンパイル T-SQL モジュールでサポートされる機能」を参照してください。For supported T-SQL constructs, see Supported Features for Natively Compiled T-SQL Modules.

ユーザー定義関数の作成、削除、および変更Creating, Dropping, and Altering User-Defined Functions

ネイティブ コンパイル済みのスカラー ユーザー定義関数を作成するには CREATE FUNCTION、このユーザー定義関数を削除するには DROP FUNCTION、この関数を変更するには ALTER FUNCTION を使用します。You use the CREATE FUNCTION to create the natively compiled, scalar user-defined function, the DROP FUNCTION to remove the user-defined function, and the ALTER FUNCTION to change the function. これらのユーザー定義関数には、BEGIN ATOMIC WITH が必要です。BEGIN ATOMIC WITH is required for the user-defined functions.

サポートされている構文と制限については、次のトピックを参照してください。For information about the supported syntax and any restrictions, see the following topics.

ネイティブ コンパイル済みのスカラー ユーザー定義関数には、sp_recompile (Transact-SQL) ストアド プロシージャを使用できます。The sp_recompile (Transact-SQL)stored procedure can be used with the natively compiled, scalar user-defined function. その場合、メタデータ内に存在する定義を使用して関数が再コンパイルされます。It will result in the function being recompiled using the definition that exists in metadata.

次のサンプルは、 AdventureWorks2016CTP3 サンプル データベースのスカラー UDF を示しています。The following sample shows a scalar UDF from the AdventureWorks2016CTP3 sample database.

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  

ユーザー定義関数の呼び出しCalling User-Defined Functions

ネイティブ コンパイル済みのスカラー ユーザー定義関数は、式 (組み込みスカラー関数および解釈されたスカラー ユーザー定義関数と同じ場所) に使用できます。Natively compiled, scalar user-defined functions can be used in expressions, in the same place as built-in scalar functions and interpreted scalar user-defined functions. ネイティブ コンパイル済みのスカラー ユーザー定義関数は、EXECUTE ステートメント、Transact-SQL ステートメント、およびネイティブ コンパイル ストアド プロシージャでも使用できます。Natively compiled, scalar user-defined functions can also be used with the EXECUTE statement, in a Transact-SQL statement and in a natively compiled stored procedure.

このスカラー ユーザー定義関数は、ネイティブ コンパイル ストアド プロシージャ、ネイティブ コンパイル済みのユーザー定義関数、および組み込み関数が許可されている任意の場所で使用できます。You can use these scalar user-defined functions in natively compiled store procedures and natively compiled user-defined functions, and wherever built-in functions are permitted. また、ネイティブ コンパイル済みのスカラー ユーザー定義関数は従来の Transact-SQL モジュールにも使用できます。You can also use natively compiled, scalar user-defined functions in traditional Transact-SQL modules.

このスカラー ユーザー定義関数は、解釈されたスカラー ユーザー定義関数を使用できる任意の場所で相互運用モードで使用できます。You can use these scalar user-defined functions in interop mode, wherever an interpreted scalar user-defined function can be used. このような使用は、「 Transactions with Memory-Optimized Tables (メモリ最適化テーブルでのトランザクション) 」の「 Supported Isolation Levels for Cross-Container Transactions (複数コンテナーにまたがるトランザクションでサポートされる分離レベル)」セクションで説明されているとおり、コンテナーにまたがるトランザクションの制約に従う必要があります。This use is subject to cross-container transaction limitations, as described in Supported Isolation Levels for Cross-Container Transactions section in Transactions with Memory-Optimized Tables. 相互運用モードの詳細については、「 解釈された Transact-SQL を使用したメモリ最適化テーブルへのアクセス」を参照してください。For more information about interop mode, see Accessing Memory-Optimized Tables Using Interpreted Transact-SQL.

ネイティブ コンパイル済みのスカラー ユーザー定義関数には、明示的な実行コンテキストが必要です。Natively compiled, scalar user-defined functions do require an explicit execution context. 詳細については、「EXECUTE AS Clause (Transact-SQL)」を参照してください。For more information, see EXECUTE AS Clause (Transact-SQL). EXECUTE AS CALLER はサポートされていません。EXECUTE AS CALLER is not supported. 詳細については、「 EXECUTE (Transact-SQL)」を参照してください。For more information, see EXECUTE (Transact-SQL).

Transact-SQL 実行ステートメントおよびネイティブ コンパイル済みのスカラー ユーザー定義関数でサポートされている構文については、「 EXECUTE (Transact-SQL)」を参照してください。For the supported syntax for Transact-SQL Execute statements, for natively compiled, scalar user-defined functions, see EXECUTE (Transact-SQL). ネイティブ コンパイル ストアド プロシージャでユーザー定義関数を実行するためにサポートされている構文については、「 ネイティブ コンパイル T-SQL モジュールでサポートされる機能」を参照してください。For the supported syntax for executing the user-defined functions in a natively compiled stored procedure, see Supported Features for Natively Compiled T-SQL Modules.

ヒントとパラメーターHints and Parameters

ネイティブ コンパイル済みのスカラー ユーザー定義関数の内部でのテーブル、結合、およびクエリ ヒントに対するサポートは、ネイティブ コンパイル ストアド プロシージャでのこれらのヒントに対するサポートと同じです。Support for table, join, and query hints inside natively compiled, scalar user-defined functions is equal to support for these hints for natively compiled stored procedures. 解釈されたスカラー ユーザー定義関数の場合と同様、ネイティブ コンパイル済みのスカラー ユーザー定義関数を参照する Transact-SQL クエリに含まれているクエリ ヒントは、このユーザー定義関数のクエリ プランに影響を与えません。As with interpreted scalar user-defined functions, the query hints included with a Transact-SQL query that reference a natively compiled, scalar user-defined function do not impact the query plan for this user-defined function.

ネイティブ コンパイル済みのスカラー ユーザー定義関数でサポートされているパラメーターは、パラメーターがスカラー ユーザー定義関数で許可されている限り、ネイティブ コンパイル ストアド プロシージャでサポートされているすべてのパラメーターです。The parameters supported for the natively compiled, scalar user-defined functions are all the parameters supported for natively compiled stored procedures, as long as the parameters are allowed for scalar user-defined functions. サポートされているパラメーターの例には、テーブル値パラメーターがあります。An example of a supported parameter is the table-valued parameter.

スキーマ バインドSchema-Bound

ネイティブ コンパイル済みのスカラー ユーザー定義関数には、次のことが当てはまります。The following apply to natively compiled, scalar user-defined functions.

  • CREATE FUNCTION および ALTER FUNCTION で WITH SCHEMABINDING 引数を使用して、スキーマ バインドにする必要があります。Must be schema-bound, by using the WITH SCHEMABINDING argument in the CREATE FUNCTION and ALTER FUNCTION.

  • スキーマ バインドのストアド プロシージャまたはユーザー定義関数によって参照されているときは、削除または変更することができません。Cannot be dropped or altered when referenced by a schema-bound stored procedure or user-defined function.

SHOWPLAN_XMLSHOWPLAN_XML

ネイティブ コンパイル済みのスカラー ユーザー定義関数は、SHOWPLAN_XML をサポートしています。Natively compiled, scalar user-defined functions support SHOWPLAN_XML. ネイティブ コンパイル ストアド プロシージャと同様、一般的な SHOWPLAN_XML スキーマに準拠しています。It conforms to the general SHOWPLAN_XML schema, as with natively compiled stored procedures. ユーザー定義関数の基本要素は <UDF>です。The base element for the user-defined functions is <UDF>.

ネイティブ コンパイル済みのスカラー ユーザー定義関数では、STATISTICS XML はサポートされていません。STATISTICS XML is not supported for natively compiled, scalar user-defined functions. STATISTICS XML を有効にして、ユーザー定義関数を参照するクエリを実行すると、ユーザー定義関数の部分が欠如した XML コンテンツが返されます。When you run a query referencing the user-defined function, with STATISTICS XML enabled, the XML content is returned without the part for the user-defined function.

アクセス許可Permissions

ネイティブ コンパイル ストアド プロシージャと同様、ネイティブ コンパイル済みのスカラー ユーザー定義関数が作成される際に、この関数から参照されるオブジェクトのアクセス許可がチェックされます。As with natively compiled stored procedures, the permissions for objects referenced from a natively compiled, scalar user-defined function are checked when the function is created. 権限を借用したユーザーに適切なアクセス許可がない場合、CREATE FUNCTION は失敗します。The CREATE FUNCTION fails if the impersonated user does not have the correct permissions. アクセス許可の変更により、権限を借用したユーザーに適切なアクセス許可がなくなった場合、以降のユーザー定義関数の実行は失敗します。If permission changes result in the impersonated user no longer having the correct permissions, subsequent executions of the user-defined function fail.

ネイティブ コンパイル ストアド プロシージャの内部でネイティブ コンパイル済みのスカラー ユーザー定義関数を使用する場合は、外部プロシージャが作成される際に、ユーザー定義関数を実行するためのアクセス許可がチェックされます。When you use a natively compiled, scalar user-defined function inside a natively compiled stored procedure, the permissions for executing the user-defined function are checked when the outer procedure is created. 外部プロシージャによって権限を借用したユーザーが、ユーザー定義関数の EXEC アクセス許可を持っていない場合、ストアド プロシージャの作成は失敗します。If the user impersonated by the outer procedure does not have EXEC permissions for the user-defined function, the creation of the stored procedure fails. アクセス許可の変更により、ユーザーに EXEC アクセス許可がなくなった場合、外部プロシージャの実行は失敗します。If permission changes result in the user no longer having the EXEC permissions, the execution of the outer procedure fails.

参照See Also

組み込み関数 (Transact-SQL) Built-in Functions (Transact-SQL)
XML 形式での実行プランの保存Save an Execution Plan in XML Format