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にスキーマバインディングと暗号化を追加する例については、複数値のテーブル値関数の作成を参照してください。