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
この場合、クエリの結果、行が返されない場合は常に特別なメッセージを返すコードを追加しました。