sql >> データベース >  >> RDS >> Sqlserver

SQLServerでテーブル値関数を作成する

    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
    

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


    1. SQLを使用してPostgresdb8.1のすべてのシーケンスを一覧表示します

    2. SQLBulkCopyが存在する場合、挿入または更新する方法はありますか?

    3. MariaDBでサブストリングを置き換える2つの方法

    4. Oracle11gでのピボット