SQL Serverでは、インラインテーブル値関数 は、2つのタイプのTransact-SQLテーブル値関数の1つです(もう1つのタイプはマルチステートメントテーブル値関数です)。
テーブル値関数(TVF)は、結果をテーブルとして返すユーザー定義関数の一種です。したがって、通常のテーブルと同じようにクエリを実行できます。
インラインTVF(ITVFと呼ばれることもあります)には、関連する戻り変数がありません。戻り値は、単一のSELECTによって定義されます。 声明。このステートメントは、戻りテーブルの構造を定義します。これは、リターン変数を必要とするマルチステートメントTVF(MSTVFとも呼ばれる)とは対照的です。
ITVFもBEGINを使用しません / END 構文。これは、MSTVFと区別するもう1つの点です。
インラインTVFは、マルチステートメントTVFよりもパフォーマンスが優れていると見なされることがよくありますが、これは関数で何をしようとしているかにも依存します。
インラインテーブル値関数の例
基本的なITVFの例を次に示します。
CREATE FUNCTION dbo.ufn_AlbumsByArtist(@ArtistId int)
RETURNS TABLE
AS
RETURN (
SELECT
al.ArtistId,
al.AlbumName,
g.Genre
FROM dbo.Albums al
INNER JOIN dbo.Artists ar
ON al.ArtistId = ar.ArtistId
INNER JOIN Genres g
ON al.GenreId = g.GenreId
WHERE al.ArtistId = @ArtistId
);
GO
基本的にはSELECTで構成されます ステートメントは他のコードにラップされています。具体的にインラインにするため TVF、RETURNS TABLEで関数を開始しました 、続いてRETURN 、およびSELECTで終了します 括弧内のステートメント。
複数のステートメント
インラインテーブル値関数は複数のSELECT用に設計されていませんが ステートメント(MSTVFの目的)では、UNIONを使用できます。 複数のステートメントの結果セットを組み合わせる演算子。
例:
CREATE FUNCTION [dbo].[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
機能オプション
スキーマバインディングを使用するかどうか(おそらく使用する必要があります)、関数を暗号化するかどうかなどを指定することもできます。
スキーマバインディングは、関数が依存する基になるオブジェクトに不利な変更が行われるのを防ぎます(テーブルの削除、列の変更など)。
暗号化は、関数の定義を難読化された形式に変換します(他の人がそれを読み取れないようにするため)。
ITVFにスキーマバインディングと暗号化を追加する例については、インラインテーブル値関数の作成を参照してください。