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