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