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

SQL Serverのインラインテーブル値関数(ITVF)の概要

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


    1. Railsの移行:PostgreSQL上のBigintが失敗しているようですか?

    2. postgresql date_truncを任意精度に?

    3. Oracleデータベースの日時値から分を取得する2つの方法

    4. SQL ServerのSelectステートメントで並べ替え(並べ替え)を使用する方法-SQL Server/TSQLチュートリアルパート109