CREATE FUNCTION
を使用して、SQL Serverでテーブル値関数(TVF)を作成できます。 T-SQL構文。
構文は、インラインテーブル値関数(ITVF)を作成するか、マルチステートメントテーブル値関数(MSTVF)を作成するかによって少し異なります。
例1-インラインテーブル値関数
インラインのテーブル値関数の例を次に示します。
CREATE FUNCTION dbo.ufn_AlbumsByGenre_ITVF(@GenreId int) RETURNS TABLE AS RETURN( SELECT ar.ArtistName, al.AlbumName, g.Genre FROM Genres g INNER JOIN Albums al ON g.GenreId = al.GenreId INNER JOIN Artists ar ON al.ArtistId = ar.ArtistId WHERE g.GenreId = @GenreId ); GO
戻りテーブルの構造を指定していないため、これはインラインのテーブル値関数であることがわかります。 RETURNS TABLE
とだけ記載されています 、次にSELECT
に依存します 戻りテーブルの構造を決定するステートメント。
この場合、この関数では、ジャンルIDを引数として渡す必要があります。
スキーマバインディングや暗号化などのオプションを追加する例については、インラインテーブル値関数の作成を参照してください。
スキーマバインディングは、関数が参照する基になるオブジェクトに不利な変更が加えられるのを防ぐため、通常は良い考えです。
例2–マルチステートメントテーブル値関数
マルチステートメントのテーブル値関数にしたい場合は、次のように関数を記述します。
CREATE FUNCTION dbo.ufn_AlbumsByGenre_MSTVF(@GenreId int) RETURNS @Albums TABLE ( ArtistName nvarchar(255), AlbumName nvarchar(255), Genre nvarchar(50) ) AS BEGIN INSERT INTO @Albums SELECT ar.ArtistName, al.AlbumName, g.Genre FROM Genres g INNER JOIN Albums al ON g.GenreId = al.GenreId INNER JOIN Artists ar ON al.ArtistId = ar.ArtistId WHERE g.GenreId = @GenreId RETURN END GO
この場合、タイプ tableの変数を使用します @Albums
と呼ばれます そして、戻りテーブルの構造を明示的に指定します。クエリ結果はその変数に保存され、関数が呼び出されたときに返されます。
MSTVFの利点の1つは、複数のステートメントを含めることができることです。ここでも、最後に余分な部分が追加されています。
CREATE FUNCTION dbo.ufn_AlbumsByGenre_MSTVF(@GenreId int) RETURNS @Albums TABLE ( ArtistName nvarchar(255), AlbumName nvarchar(255), Genre nvarchar(50) ) AS BEGIN INSERT INTO @Albums SELECT ar.ArtistName, al.AlbumName, g.Genre FROM Genres g INNER JOIN Albums al ON g.GenreId = al.GenreId INNER JOIN Artists ar ON al.ArtistId = ar.ArtistId WHERE g.GenreId = @GenreId IF @@ROWCOUNT = 0 BEGIN INSERT INTO @Albums VALUES ( 'None', 'None', 'None' ) END RETURN END GO
スキーマバインディングや暗号化などのオプションを追加する例については、マルチステートメントテーブル値関数の作成を参照してください。