Share via


ユーザー定義関数の作成 (データベース エンジン)

ユーザー定義関数の作成には CREATE FUNCTION ステートメントを、変更には ALTER FUNCTION ステートメントを、削除には DROP FUNCTION ステートメントを使用します。ユーザー定義関数の各完全修飾名 (schema_name.function_name) は、一意にする必要があります。

ガイドライン

ステートメントがキャンセルされて、モジュール (トリガやストアド プロシージャ) 内の次のステートメントが続行されるような Transact-SQL エラーについては、関数内では扱いが異なります。関数内では、このようなエラーによって関数自体の実行が停止されます。そのため、次に関数を呼び出したステートメントもキャンセルされることになります。

BEGIN...END ブロック内のステートメントは、副作用を伴いません。関数の副作用とは、データベース テーブルの変更など、その関数の有効範囲外のリソースの状態を永続的に変更してしまうことです。関数内のステートメントが変更できる内容は、ローカル カーソルまたはローカル変数など、その関数に対してローカルなオブジェクトの変更のみです。データベース テーブルの変更、関数に対してローカルではないカーソルの操作、電子メールの送信、カタログ変更、ユーザーへ返す結果セットの生成などの操作は、関数では実行できません。

注意

CREATE FUNCTION ステートメントの実行時に、存在しないリソースに対する副作用がもたらされる場合は、SQL Server によってステートメントが実行されます。ただし、SQL Server では関数は呼び出されても実行されません。

クエリで指定した関数が実際に実行される回数は、オプティマイザで作成された実行プランによって異なります。WHERE 句のサブクエリによって起動された関数がその一例です。サブクエリとその関数が実行された回数は、オプティマイザが選択したアクセス パスの違いによって変わります。

関数で有効なステートメント

関数では、次の種類のステートメントが有効です。

  • 関数に対してローカルなデータ変数やカーソルを定義するために使用できる DECLARE ステートメント。

  • 関数に対してローカルなオブジェクトへの値の代入。たとえば、SET を使用してスカラ変数やテーブルのローカル変数に値を代入します。

  • ローカル カーソルを参照するカーソル操作。ローカル カーソルとは、関数内で宣言され、開かれ、閉じられ、割り当てが解除されるカーソルです。クライアントにデータを返す FETCH ステートメントは使用できません。INTO 句を使用してローカル変数に値を代入する FETCH ステートメントのみを使用できます。

  • TRY...CATCH ステートメントを除く、フロー制御ステートメント。

  • 選択リストに、関数に対してローカルな変数に値を代入する式が含まれる、SELECT ステートメント。

  • 関数に対してローカルなテーブル変数を変更する INSERT、UPDATE、および DELETE の各ステートメント。

  • 拡張ストアド プロシージャを呼び出す EXECUTE ステートメント。

組み込みシステム関数

Transact-SQL ユーザー定義関数では、次の非決定的な組み込み関数を使用できます。

CURRENT_TIMESTAMP

@@MAX_CONNECTIONS

GET_TRANSMISSION_STATUS

@@PACK_RECEIVED

GETDATE

@@PACK_SENT

GETUTCDATE

@@PACKET_ERRORS

@@CONNECTIONS

@@TIMETICKS

@@CPU_BUSY

@@TOTAL_ERRORS

@@DBTS

@@TOTAL_READ

@@IDLE

@@TOTAL_WRITE

@@IO_BUSY

 

Transact-SQL ユーザー定義関数では、次の非決定的な組み込み関数を使用できません。

NEWID

RAND

NEWSEQUENTIALID

TEXTPTR

決定的および非決定的な組み込みシステム関数の一覧については、「決定的関数と非決定的関数」を参照してください。

スキーマ バインド関数

CREATE FUNCTION は、SCHEMABINDING 句をサポートしています。この句は、テーブル、ビュー、およびその他のユーザー定義関数など、参照対象オブジェクトのスキーマにその関数をバインドします。スキーマ バインド関数によって参照されるオブジェクトを変更または削除しようとすると、失敗します。

CREATE FUNCTION に SCHEMABINDING を指定するには、次の条件を満たしている必要があります。

  • CREATE 関数が参照するすべてのビューとユーザー定義関数が、スキーマにバインドされている必要があります。

  • この関数が参照するすべてのオブジェクトが、その関数と同じデータベースに含まれている必要があります。対象となるオブジェクトは、1 つまたは 2 つの要素で構成される名前を使用して参照する必要があります。

  • 関数内のすべての参照対象オブジェクト (テーブル、ビュー、およびユーザー定義関数) に REFERENCES 権限を所持している必要があります。

ALTER FUNCTION を使用して、スキーマ バインドを削除できます。関数を再定義するには、ALTER FUNCTION ステートメントを使用します。WITH SCHEMABINDING は指定しないでください。

パラメータの指定

ユーザー定義関数は、0 個またはそれ以上の入力パラメータを受け取り、スカラ値またはテーブルのいずれかを返します。1 つの関数では、最大で 1,024 個の入力パラメータを受け取ることができます。関数のパラメータが既定値を持つ場合は、既定値を得るために、関数を呼び出すときに DEFAULT キーワードを指定する必要があります。この動作はユーザー定義ストアド プロシージャ内の既定値を持つパラメータとは異なります。ユーザー定義ストアド プロシージャの場合は、パラメータを省略すると既定値が暗黙的に使用されます。ユーザー定義関数では、出力パラメータがサポートされません。