SQL Serverでは、マルチステートメントテーブル値関数 は、2種類のTransact-SQLテーブル値関数の1つです(もう1つのタイプはインラインテーブル値関数です)。
テーブル値関数(TVF)は、結果をテーブルとして返すユーザー定義関数の一種です。したがって、通常のテーブルと同じようにクエリを実行できます。
マルチステートメントTVF(MSTVFと呼ばれることもあります)は、複数のステートメントで構成でき、その結果は戻り変数に格納されます。関数の先頭に戻り変数の指定を含めます。これは、戻りテーブルの構造を指定します。つまり、列の数、名前、データ型などを指定します。
これは、戻り変数を使用しないインラインTVF(ITVFとも呼ばれる)とは対照的です(戻りテーブルはSELECT
によって定義されます)。 声明)。
MSTVFもBEGIN
を使用します / END
構文。これは、ITVFと区別するもう1つの点です(ITVFはその構文を使用しません)。
マルチステートメントテーブル値関数の例
基本的なMSTVFの例を次に示します。
CREATE FUNCTION dbo.udf_PetsByName_MSTVF( @PetName varchar(70)) RETURNS @pets TABLE ( PetId varchar(20), PetName varchar(70) ) AS BEGIN INSERT INTO @pets SELECT CONCAT('Cat', ' ', CatId), CatName FROM dbo.Cats WHERE CatName = @PetName; INSERT INTO @pets SELECT CONCAT('Dog', ' ', DogId), DogName FROM dbo.Dogs WHERE DogName = @PetName; IF @@ROWCOUNT = 0 BEGIN INSERT INTO @pets VALUES ( '', 'There are no pets of that name.' ) END RETURN; END; GO
ここでは、@pets
という戻り変数を定義することから関数を開始します。 。タイプはテーブルです 、および2つの列を返します。
この場合、2つのSELECT
があります ステートメントとIF
声明。それぞれの結果は、戻り変数に格納されます。これは、INSERT
を介して行われます。 毎回ステートメント。
機能オプション
スキーマバインディングを使用するかどうか(おそらく使用する必要があります)、関数を暗号化するかどうかなどを指定することもできます。
スキーマバインディングは、関数が依存する基になるオブジェクトに不利な変更が行われるのを防ぎます(テーブルの削除、列の変更など)。
暗号化は、関数の定義を難読化された形式に変換します(他の人がそれを読み取れないようにするため)。
ITVFにスキーマバインディングと暗号化を追加する例については、複数値のテーブル値関数の作成を参照してください。