SQL Serverには、さまざまな操作を実行できる組み込み関数のコレクションが付属しています。各組み込み関数は特定の目的を果たし、変更することはできません。関数が目的にかなう場合は、先に進んでそれを使用できます。
しかし、目的にかなう機能が見つからない場合はどうでしょうか。
次に、独自のユーザー定義関数を作成します。
ユーザー定義関数とは何ですか?
ユーザー定義関数 (UDF)は、パラメーターを取り、計算またはその他のアクションを実行し、結果を返すことができるルーチンです。そしてその名前が示すように、それはユーザーによって定義され、作成されます。この場合、「ユーザー」はSQLプログラマー、DBA、または関数を作成した人です。
ユーザー定義関数という用語は、SQLServerに付属している組み込み関数とは区別されます。
UDFがパラメーターを受け入れるかどうか、受け入れる場合はその名前、データ型などを指定できます。たとえば、引数として製品IDを受け入れるUDFを作成できます。関数はそれを計算に使用できます。これは、関数の出力が、呼び出されたときに関数に提供される入力に依存することを意味します。
UDFが作成されると、それを呼び出すことができます。
ユーザー定義関数の呼び出し
関数の作成時には、関数内のコードは実行されません。関数が呼び出されたときにのみ実行されます 。
関数の「呼び出し」は、関数の「呼び出し」と呼ばれることもあります。これは、関数が作成されたことを実行するようになるときです。基本的には、関数を作成し、そこに座って呼び出されるのを待ちます。
システム関数を呼び出すのと同じように、T-SQLコードからUDFを呼び出すことができます。たとえば、WHERE
でUDFを使用できます SELECT
の結果を絞り込むための句 声明。列のリストでそれを使用して返すこともできます。
UDFは、計算列でも使用できます。これは、別の列のデータにアクセスするために計算列が必要な場合に便利です。
パラメータ
ユーザー定義関数は、最大1024個の入力パラメーターを受け入れることができます。ただし、必要に応じて、パラメータなしで関数を定義することもできます。
パラメータのない組み込み関数の例は、GETDATE()
です。 。この関数は、現在のデータベースシステムのタイムスタンプを返すだけです。それを取得するためにパラメータを渡す必要はありません。
単一のパラメーターを持つユーザー定義関数の例として、顧客のIDに基づいて顧客の連絡先の詳細を返す関数があります。関数を呼び出すときは、顧客のIDをパラメーターとして関数に渡します。次に、この関数は顧客の詳細を検索し、それらを戻り変数に返すことができます。別の顧客のIDを渡すと、関数はその顧客の詳細を返します。
ユーザー定義関数の利点
UDFの主な利点には、次のようなものがあります。
- モジュラープログラミング
- UDFを使用すると、コードを1回記述してから、必要な回数だけ呼び出すことができます。同じことをする必要があるたびに同じコードを書き直す必要はありません。代わりに関数を呼び出すだけです。これは、何かが変わった場合にも役立ちます。更新する必要があるのは、関数という1か所だけです。この関数を使用しなかった場合は、アプリケーション全体で複数の場所で関数を更新する必要があります。
- パフォーマンス
- UDFは、プランをキャッシュして繰り返し実行するために再利用することで、T-SQLコードのコンパイルコストを削減します。 UDFは、使用するたびに再解析および再最適化する必要はありません。これにより、実行時間が大幅に短縮されます。
- ネットワークトラフィックの削減
- 単一のスカラー式では表現できない複雑な制約に基づいてデータをフィルタリングする演算は、関数として表現できます。この関数は、
WHERE
で呼び出すことができます。 クライアントに送信される行数を減らす句。
UDFには、別のテーブルのデータにアクセスする計算列で説明した前の例のように、他のより具体的な利点もあります。
ユーザー定義関数の種類
T-SQLユーザー定義関数には次の2種類があります。
- スカラー関数
- ユーザー定義のスカラー関数は単一のデータ値を返します。関数で値のタイプを定義します。戻り値のタイプは、テキスト以外の任意のデータタイプにすることができます 、 ntext 、画像 、カーソル 、およびタイムスタンプ 。
- テーブル値関数
- テーブル値関数(TVF)はテーブルを返します。したがって、それらのリターンタイプはテーブル 。 TVFには、インラインTVFとマルチステートメントTVFの2種類があります。インラインTVFには機能本体がありません。その戻りテーブルは、単一の
SELECT
の結果です。 声明。一方、マルチステートメントTVFには、機能本体があります。マルチステートメントTVFでは、戻り変数でテーブルの構造を指定します。
共通言語ランタイム(CLR)ユーザー定義関数として、スカラー関数とテーブル値関数を作成することもできます。
SQL Server 2005(9.x)以降では、Microsoft VisualBasic.NETやMicrosoftVisualC#などの任意のMicrosoft.NETFrameworkプログラミング言語でユーザー定義関数を記述できます。