SQL Serverでテーブル値関数(TVF)を作成する場合、インラインテーブル値関数(ITVF)またはマルチステートメントテーブル値関数(MSTVF)のいずれかにすることができます。これらの関数タイプには違いがあり、それに応じて異なる構文を使用します。
この記事では、MSTVFとITVFの違いについて説明します。
違い
MSTVFとITVFの主な違いは次のとおりです。
ITVF | MSTVF | |
---|---|---|
RETURNS構文 | あなたは単にRETURNS TABLE と述べます 戻りテーブルの定義は、関数のSELECT に基づきます。 声明。戻りテーブルの構造を指定する必要はありません。 | あなたのRETURNS 構文は、戻りテーブルの構造を明示的に指定します。これは、関数の値として返される行を格納および累積するために使用されるTABLE変数を宣言することによって行われます。 |
BEGIN/END構文 | ITVFはBEGIN を使用しません / END 構文。 | MSTVFはBEGIN を使用します / END 構文。 |
パフォーマンス | 一般的にMTSVFよりも高速です。 | 一般的にITVFよりも低速です。 |
データの更新 | 場合によっては、ITFVを使用して基になるテーブルのデータを更新することが可能です。 | MSTVFを使用して基になるテーブルのデータを更新することはできません。 |
構文
各関数型の構文の違いを見てみましょう。
インラインテーブル値関数
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ = default ] [ READONLY ] } [ ,...n ] ] ) RETURNS TABLE [ WITH <function_option> [ ,...n ] ] [ AS ] RETURN [ ( ] select_stmt [ ) ] [ ; ]
マルチステートメントテーブル値関数
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ = default ] [READONLY] } [ ,...n ] ] ) RETURNS @return_variable TABLE <table_type_definition> [ WITH <function_option> [ ,...n ] ] [ AS ] BEGIN function_body RETURN END [ ; ]
MSTVFはテーブル定義で始まりますが、ITVFにはそのような定義がないことに注意してください。
MSTVFはRETURNS @return_variable TABLE
で始まります その後にテーブル定義が続きます。ここでは、@return_variable
はTABLE変数であり、関数の値として返される行を格納および累積するために使用されます。
例1-インラインテーブル値関数
簡単なITVFの例を次に示します。
CREATE FUNCTION udf_PetsByName_ITVF( @PetName varchar(70)) RETURNS TABLE AS RETURN ( SELECT CONCAT('Cat', ' ', CatId) AS PetId, CatName FROM dbo.Cats WHERE CatName = @PetName UNION ALL SELECT CONCAT('Dog', ' ', DogId) AS PetId, DogName FROM dbo.Dogs WHERE DogName = @PetName ); GO
ここでは、UNION ALL
を使用して2つのテーブルから選択します 、関数は単に結果を返します。
例2–マルチステートメントテーブル値関数
これは、MSTVFを使用して同じことを行う例ですが、方法が異なります。
CREATE FUNCTION 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; RETURN; END; GO
この関数は、@pets
というTABLE変数を宣言することから始まります。 。これを行う際に、戻りテーブルの構造を明示的に指定します。
BEGIN
内のクエリ / END
ブロックは@pets
というTABLE変数に保存されます 。
この場合、UNION ALL
を使用しないことを選択しました 。代わりに、ステートメントを個別に実行し、各ステートメントの結果を@pets
に保存しました。 変数。
例3–MSTVFに別のステートメントを追加する
MSTVFの「マルチステートメント」の側面をさらに示すために、上記のMSTVFにステートメントを追加して、結果を同じ戻り変数に保存できます。
例:
CREATE FUNCTION 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
この場合、クエリの結果、行が返されない場合は常に特別なメッセージを返すコードを追加しました。