省略可能な引数を持つ関数の作成 [SQLServer]

SQLServerではユーザーが定義する独自の関数をデータベース内に作成することができます。
ユーザー定義関数は、値を返すスカラー関数やテーブルのような結果表を返すテーブル値関数が作成でき、関数には結果を返すのに必要な引数を指定することができます。
関数を作っていると、引数が必要な場合と特定の場合は引数を指定しなくてもよい場合が出てきます。

例えば簡単な例では、数値型の引数を3つ取る関数があり、3つの引数の合計値を算出するとします。
第1引数と第2引数は必須で戻り値として第1引数と第2引数を加算した結果を返します。
第3引数は指定があれば上記の結果にさらに第3引数の値を加算した値を戻り値として返し、第3引数の指定がなければ上記の結果(第1引数と第2引数のみを加算した値)を戻り値として返す関数です。

今回は上記のような関数を作成する際に必要になる
「SQLServerにユーザー定義関数を作成する際の引数を省略可能にするための記述方法」
について紹介します。

省略可能な引数を定義した関数の作成例

省略可能な引数を持つ関数の作成例として、年齢を取得する関数を作成します。
この関数は引数に2つの日付型の値を取ります。
第1引数には生年月日を取り、第2引数には年齢を算出する基準となる日付を取ります。
第2引数の基準日は指定がある場合は指定された日付時点の年齢を算出し、指定がない場合は現在の日付(GETDATE関数で取得できるサーバー日付)時点の年齢を算出します。

サンプル関数のSQL

省略可能な引数を持つ年齢を算出する関数のサンプルSQLを次に示します。
この関数は「@DATE_OF_BIRTH AS DATE(生年月日)」と「@REFERENCE_DATE AS DATE(基準日)」の2つの引数を取ります。2つの引数のうち「@REFERENCE_DATE AS DATE(基準日)」が省略可能な引数になります。

省略可能な引数を定義した関数の使用例

作成した年齢を取得する関数を使う側のSQLについて記載します。
ここでは、関数を呼び出す際に引数を省略しない場合と、引数を省略する場合の2つのパターンでのSQLをサンプルとして示します。

引数を省略しない場合

引数を省略しない場合の関数の使用例です。

実行結果

省略可能なSQLServerの関数を引数を省略しないで呼び出した場合

省略可能な引数がない関数を呼び出す場合と同じなので問題はないと思います。

引数を省略する場合

引数を省略する場合の関数の使用例です。

実行結果

省略可能なSQLServerの関数を引数を省略して呼び出した場合

省略可能な引数がある場合は記述を省略するのではなく、「DEFAULT」と記述します。
SQLServerの省略可能な引数を持つ関数では、完全に引数を省略することはできません。
(ストアド プロシージャの場合は省略可能な引数を持つ場合に完全に省略ができますが関数ではできません。)

省略可能な引数を持つストアド プロシージャについては、以下の記事を参考にしてください。

省略可能な引数を持つストアドプロシージャの作成 [SQLServer]
ストアド プロシージャの引数は必ず必要とは限りません。 例えば、SQLServerに標準に用意されているストアド プロシージャの中にも、引...