適用対象:Microsoft Fabric SQL 分析エンドポイントと Warehouse
CREATE FUNCTION
では、インライン テーブル値関数とスカラー関数を作成できます。
注
スカラー UDF は、Fabric Data Warehouse のプレビュー機能です。
Von Bedeutung
Fabric Data Warehouse では、ユーザー テーブルに対するSELECT ... FROM
クエリで使用するためにスカラー UDF をインライン化できる必要がありますが、インライン化できない関数を作成することはできます。 インライン化できないスカラー UDF は、限られた数のシナリオで機能します。
UDF をインライン化できるかどうかを確認できます。
ユーザー定義の関数は、パラメーターを受け取り、複雑な計算などの操作を実行する Transact-SQL ルーチンであり、そのアクションの結果を値として返します。 スカラー関数は、数値や文字列などのスカラー値を返します。 ユーザー定義のテーブル値関数 (TVF) は、テーブルを返します。
CREATE FUNCTION
を使用して、次の方法で使用できる再利用可能な T-SQL ルーチンを作成します。
- Transact-SQL ステートメントでは、次のような
SELECT
- Transact-SQL データ操作ステートメント (DML) (
UPDATE
、INSERT
、およびDELETE
- 関数を呼び出すアプリケーション内で使用する
- 別のユーザー定義関数の定義内で使用する
- ストアド プロシージャを置換する
ヒント
CREATE OR ALTER FUNCTION
を指定して、その名前で新しい関数が存在しない場合は作成するか、1 つのステートメントで既存の関数を変更できます。
構文
スカラー関数の構文
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
ユーザー定義関数のパラメータ。 1 つ以上のパラメーターを宣言できます。
1 つの関数では、最高 2,100 個のパラメーターを使用できます。 宜言した各パラメーターの値は、関数の実行時に、ユーザーが指定する必要があります (そのパラメーターの既定値が定義されていない場合)。
パラメーター名は、最初の文字をアット マーク ( @
) にして指定します。 パラメーター名は識別子のルールに従っている必要があります。 パラメーターは関数に対してローカルです。同じパラメーター名を他の関数で使用できます。 パラメーターは定数の代わりとしてのみ使用できます。パラメーターは、テーブル名、列名、またはその他のデータベース オブジェクト名の代わりに使用することはできません。
注
ANSI_WARNINGS
は、ストアド プロシージャ、ユーザー定義関数でパラメーターを渡す場合、またはバッチ ステートメントで変数を宣言して設定する場合には適用されません。 たとえば、変数を char(3) と定義し、これに 4 文字以上の値を設定すると、データが定義されたサイズに合わせて切り捨てられてから、INSERT または UPDATE ステートメントが成功します。
parameter_data_type
パラメーターのデータ型。 Transact-SQL 関数の場合、サポートされているすべての スカラー データ型 が許可されます。
[ = デフォルト ]
パラメータのデフォルト値。 default 値が定義されている場合は、パラメーターに値を指定せずに関数を実行できます。
関数のパラメータにデフォルト値がある場合、デフォルト値を取得するために関数を呼び出すときにキーワード DEFAULT
を指定する必要があります。 この動作は、ストアド プロシージャで既定値を持つパラメーターを使用する場合とは異なります。ストアド プロシージャの場合は、パラメーターを省略すると既定値が暗黙的に使用されます。
return_data_type
スカラーユーザー定義関数の戻り値。
Fabric Data Warehouse の関数の場合、 rowversion/timestamp を除くすべてのデータ型が許可されます。 テーブルのような非スカラー型は使用できません。
function_body
一連の Transact-SQL ステートメント。
スカラー関数では、 function_body はスカラー値に評価される一連の Transact-SQL ステートメントであり、次のような場合があります。
- 単一ステートメント式
- 複数ステートメント式 (
IF/THEN/ELSE
およびBEGIN/END
ブロック) - ローカル変数
- 使用可能な組み込み SQL 関数の呼び出し
- 他の UDF の呼び出し
-
SELECT
ステートメント、およびテーブル、ビュー、インライン テーブル値関数への参照
scalar_expression
スカラー関数が返すスカラー値を指定します。
select_stmt
インライン テーブル値関数の戻り値を定義する単一の SELECT
ステートメント。 インライン テーブル値関数の場合、関数本体はありません。テーブルは、単一の SELECT
ステートメントの結果セットです。
テーブル
テーブル値関数 (TVF) の戻り値がテーブルになるように指定します。 TVF に渡すことができるのは、定数と @local_variables のみです。
インライン TVF (プレビュー) では、TABLE 戻り値は 1 つの SELECT
ステートメントを使用して定義されます。 インライン関数には、関連付けられている戻り変数はありません。
<function_option>
Fabric Data Warehouse では、 INLINE
、 ENCRYPTION
、 EXECUTE AS
キーワードはサポートされていません。
サポートされる関数オプションは次のとおりです。
SCHEMABINDING
参照するデータベース オブジェクトに対して、その関数がバインドされるように指定します。 SCHEMABINDING を指定した場合、ベース オブジェクトに対して関数定義に影響を与えるような変更は行えません。 まず関数定義を変更または削除して、変更するオブジェクトとの依存関係を解消する必要があります。
関数が参照するオブジェクトへのバインドは、次のいずれかの操作が行われた場合にのみ削除されます。
関数を削除した場合。
関数を、SCHEMABINDING オプションを指定せずに ALTER ステートメントを使用して変更した場合。
関数をスキーマにバインドできるのは、次の条件が満たされている場合に限られます。
関数によって参照されているすべてのユーザー定義関数もスキーマにバインドします。
関数によって参照されるオブジェクトは、2 つの部分からなる名前を使用して参照されます。
同じデータベース内の組み込み関数とその他の UDF のみを、UDF の本体内で参照することができます。
CREATE FUNCTION
ステートメントを実行したユーザーには、関数が参照するデータベース オブジェクトに対する REFERENCES 権限があります。
SCHEMABINDING を削除するには、 ALTER
を使用します。
NULL 入力で NULL を返す | NULL 入力で呼び出される
スカラー値関数の OnNULLCall
属性を指定します。 指定しない場合、 CALLED ON NULL INPUT
は既定で暗黙的に指定され、 NULL
が引数として渡された場合でも関数本体が実行されます。
ベスト プラクティス
スキーマ バインドを使用してユーザー定義関数が作成されていない場合、基になるオブジェクトに加えられた変更が関数の定義に影響し、呼び出されたときに予期しない結果が生成される可能性があります。 関数を作成するときは、
WITH SCHEMABINDING
句を指定することをお勧めします。 これにより、関数定義で参照されているオブジェクトは、一緒に関数も変更しない限り変更できなくなります。インライン化可能なユーザー定義関数を記述する。 詳細については、「スカラー UDF のインライン化」を参照してください。
相互運用性
インライン テーブル値ユーザー定義関数
インライン テーブル値関数では、1 つの select ステートメントのみが許可されます。
スカラー ユーザー定義関数
スカラー値関数で有効なステートメントは以下のとおりです。
- 代入ステートメント
- control-of-Flow ステートメント (
TRY...CATCH
ステートメントを除く) -
DECLARE
ローカル データ変数を定義するステートメント
次の組み込み関数は、スカラー値関数本体ではサポートされていません。
次の場合、ユーザー テーブルの
SELECT ... FROM
クエリではスカラー UDF を使用できません。- UDF 本体には、非決定的な組み込み関数の呼び出しが含まれています。 決定論的関数と非決定的関数を参照してください。
- UDF 本文には、 共通テーブル式 (CTE) が含まれています。
- UDF 本体には、6 つの
IF
-THEN
-ELSE
ブロックを超える複数ステートメントの UDF 本文が含まれています。 - UDF 本文に WHILE LOOP が含まれている
- その他の理由により、UDF 本文をインライン化できません。 詳細については、「 スカラー UDF のインライン化の要件」を参照してください。
スカラー UDF は、次の場合にクエリで使用できません。
- UDF は、
GROUP BY
句で直接呼び出されます。 - UDF は、
ORDER BY
clause で直接呼び出されます。 - 呼び出し元クエリには共通 のテーブル式 (CTE) があります。
- UDF は、
再帰スカラー UDF はサポートされていません。
1 つのクエリで 10 を超える UDF 呼び出しが行われた場合、ユーザー クエリは失敗する可能性があります。
エッジ ケースによっては、ユーザー クエリと UDF 本文の複雑さがインライン化を妨げる場合があります。その場合、スカラー UDF はインライン化されず、ユーザー クエリは失敗します。
サポートされていないシナリオでスカラー UDF を使用すると、"
Scalar UDF execution is currently unavailable in this context.
" というエラー メッセージが表示されます
制限事項
注
現在のプレビュー期間中は、制限事項が変更される可能性があります。
ユーザー定義関数は、データベースの状態を変更するアクションの実行に使用することはできません。
ユーザー定義関数は入れ子にすることができます。つまり、1 つのユーザー定義関数で、別のユーザー定義関数を呼び出すことができます。 呼び出された関数が実行を開始すると入れ子レベルが 1 つ上がり、呼び出された関数が実行を終了するとレベルが 1 つ下がります。 FABRIC Data Warehouse のユーザー定義関数は、UDF 本体がテーブル/ビュー/インライン テーブル値関数を参照する場合は最大 4 レベル、それ以外の場合は最大 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: 関数によって参照される基になるオブジェクトを表示します。
アクセス許可
Fabric ワークスペース管理者ロール、メンバー ロール、および共同作成者ロールのメンバーは、関数を作成できます。
スカラー UDF のインライン化
Microsoft Fabric Data Warehouse では 、スカラー UDF インライン化を 使用して、ユーザー定義コードを分散方式でコンパイルおよび実行します。 スカラー UDF のインライン化は、既定で有効になっています。
スカラー UDF インライン化は、Microsoft SQL Server 2019 (15.0) で最初に導入されたパフォーマンス最適化手法ですが、Fabric Data Warehouse では、サポートされている一連のシナリオを決定します。 Fabric Data Warehouse では、スカラー UDF は自動的にスカラー式またはスカラー サブクエリに変換され、UDF 演算子の代わりに呼び出し元のクエリで置き換えられます。
一部の T-SQL 構文では、スカラー UDF を非インライン化できます。
WHILE
ループ、複数のRETURN
ステートメント、または非決定的 SQL 組み込み関数 (GETUTCDATE()
やGETDATE()
など) の呼び出しを含む関数はインライン化できません。 詳細については、「 スカラー UDF のインライン化の要件」を参照してください。
スカラー UDF をインライン化できるかどうかを確認する
sys.sql_modules
カタログ ビューには、UDF がインライン化可能かどうかを示す列is_inlineable
が含まれています。
is_inlineable
プロパティは、UDF 定義内の構文のチェックから派生します。 スカラー UDF は、コンパイル時の前にインライン化されません。
1
の値は UDF がインライン可能であることを示し、0
の値はインライン化不可能であることを示します。 スカラー UDF がインライン化可能な場合、クエリのコンパイル時に常にインライン化されるとは限りません。
Fabric Data Warehouse は、全体的なクエリの複雑さに応じて、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';
例示
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 を使用し、クロス適用によって結果を他のテーブルと結合する方法を示したものです。 ここでは、type
列に一致するすべての行について、sys.objects
と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;
Fabric Data Warehouse でスカラー 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;
INSERT
、UPDATE
、DELETE
などのデータ操作言語 (DML) ステートメントの場合:
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
Analytics Platform System (PDW)
Azure Synapse Analytics または Analytics Platform System (PDW) でユーザー定義関数 (UDF) を作成します。 ユーザー定義の関数は、パラメーターを受け取り、複雑な計算などの操作を実行する Transact-SQL ルーチンであり、そのアクションの結果を値として返します。 ユーザー定義テーブル値関数 (TVF) は、table データ型を返します。
Analytics Platform System (PDW) では、戻り値はスカラー (単一) 値である必要があります。
Azure Synapse Analytics では、
CREATE FUNCTION
はインライン テーブル値関数の構文 (プレビュー) を使用してテーブルを返すか、スカラー関数の構文を使用して 1 つの値を返すことができます。Azure Synapse Analytics のサーバーレス SQL プールでは、
CREATE FUNCTION
はインライン テーブル値関数を作成できますが、スカラー関数は作成できません。このステートメントを使用して、次の方法で使用できる再利用可能なルーチンを作成します。
Transact-SQL ステートメントでは、次のような
SELECT
関数を呼び出すアプリケーション内で使用する
別のユーザー定義関数の定義内で使用する
列の CHECK 制約を定義する
ストアド プロシージャを置換する
セキュリティ ポリシーのフィルター述語としてのインライン関数を使用します。
ヒント
Fabric Data Warehouse の構文については、Microsoft Fabric Data Warehouse の CREATE FUNCTION のバージョンを参照してください。
構文
スカラー関数の構文
-- 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
ユーザー定義関数のパラメータ。 1 つ以上のパラメーターを宣言できます。
1 つの関数では、最高 2,100 個のパラメーターを使用できます。 宜言した各パラメーターの値は、関数の実行時に、ユーザーが指定する必要があります (そのパラメーターの既定値が定義されていない場合)。
パラメーター名は、最初の文字をアット マーク ( @
) にして指定します。 パラメーター名は識別子のルールに従っている必要があります。 パラメーターは関数に対してローカルです。同じパラメーター名を他の関数で使用できます。 パラメーターは定数の代わりとしてのみ使用できます。パラメーターは、テーブル名、列名、またはその他のデータベース オブジェクト名の代わりに使用することはできません。
注
ANSI_WARNINGS
は、ストアド プロシージャ、ユーザー定義関数でパラメーターを渡す場合、またはバッチ ステートメントで変数を宣言して設定する場合には適用されません。 たとえば、変数を char(3) と定義し、これに 4 文字以上の値を設定すると、データが定義されたサイズに合わせて切り捨てられてから、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) の戻り値がテーブルになるように指定します。 TVF に渡すことができるのは、定数と @local_variables のみです。
インライン TVF (プレビュー) では、TABLE 戻り値は 1 つの SELECT
ステートメントを使用して定義されます。 インライン関数には、関連付けられている戻り変数はありません。
<function_option>
関数に次のオプションの 1 つ以上があることを指定します。
SCHEMABINDING
参照するデータベース オブジェクトに対して、その関数がバインドされるように指定します。 SCHEMABINDING を指定した場合、ベース オブジェクトに対して関数定義に影響を与えるような変更は行えません。 まず関数定義を変更または削除して、変更するオブジェクトとの依存関係を解消する必要があります。
関数が参照するオブジェクトへのバインドは、次のいずれかの操作が行われた場合にのみ削除されます。
関数を削除した場合。
関数を、SCHEMABINDING オプションを指定せずに ALTER ステートメントを使用して変更した場合。
関数をスキーマにバインドできるのは、次の条件が満たされている場合に限られます。
関数によって参照されているすべてのユーザー定義関数もスキーマにバインドします。
関数と関数によって参照されるその他の UDF は、1 つのパーツまたは 2 つのパーツの名前を使用して参照されます。
同じデータベース内の組み込み関数とその他の UDF のみを、UDF の本体内で参照することができます。
CREATE FUNCTION
ステートメントを実行したユーザーには、関数が参照するデータベース オブジェクトに対する REFERENCES 権限があります。
SCHEMABINDING を削除するには、 ALTER
を使用します。
NULL 入力で NULL を返す | NULL 入力で呼び出される
スカラー値関数の OnNULLCall
属性を指定します。 指定しない場合、 CALLED ON NULL INPUT
は既定で暗黙的に指定され、 NULL
が引数として渡された場合でも関数本体が実行されます。
ベスト プラクティス
ユーザー定義関数が SCHEMABINDING 句を使って作成されていない場合、基になるオブジェクトに行った変更は関数の定義に影響し、呼び出されたときに予期しない結果が生じる可能性があります。 関数を作成するときは、 WITH SCHEMABINDING
句を指定することをお勧めします。 これにより、関数定義で参照されているオブジェクトは、一緒に関数も変更しない限り変更できなくなります。
相互運用性
スカラー値関数で有効なステートメントは以下のとおりです。
代入ステートメント。
TRY...CATCH ステートメント以外の流れ制御ステートメント。
ローカル データ変数を定義する DECLARE ステートメント。
インライン テーブル値関数 (プレビュー) では、select ステートメントを 1 つだけ使用できます。
制限事項
ユーザー定義関数は、データベースの状態を変更するアクションの実行に使用することはできません。
ユーザー定義関数は入れ子にすることができます。つまり、1 つのユーザー定義関数で、別のユーザー定義関数を呼び出すことができます。 呼び出された関数が実行を開始すると入れ子レベルが 1 つ上がり、呼び出された関数が実行を終了するとレベルが 1 つ下がります。 入れ子レベルが最大値を超えると、関数チェーン全体の呼び出しが失敗します。 Microsoft Fabric Data Warehouse では、ユーザー定義関数を最大 5 つのレベルに入れ子にすることができます。
関数などのオブジェクトを、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 を使用し、クロス適用によって結果を他のテーブルと結合する方法を示したものです。 ここでは、type
列に一致するすべての行について、sys.objects
とModulesByType
の結果の両方からすべての列を選択します。 apply の使用方法の詳細については、 FROM 句と JOIN、APPLY、PIVOT (Transact-SQL) を参照してください。
SELECT *
FROM sys.objects o
CROSS APPLY dbo.ModulesByType(o.type);
GO
注
インライン テーブル値関数は、サーバーレス SQL プールで使用できますが、専用 SQL プールではプレビュー段階です。