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

SQL Serverのマルチステートメントテーブル値関数(MSTVF)の概要

    SQL Serverでは、マルチステートメントテーブル値関数 は、2種類のTransact-SQLテーブル値関数の1つです(もう1つのタイプはインラインテーブル値関数です)。

    テーブル値関数(TVF)は、結果をテーブルとして返すユーザー定義関数の一種です。したがって、通常のテーブルと同じようにクエリを実行できます。

    マルチステートメントTVF(MSTVFと呼ばれることもあります)は、複数のステートメントで構成でき、その結果は戻り変数に格納されます。関数の先頭に戻り変数の指定を含めます。これは、戻りテーブルの構造を指定します。つまり、列の数、名前、データ型などを指定します。

    これは、戻り変数を使用しないインラインTVF(ITVFとも呼ばれる)とは対照的です(戻りテーブルはSELECTによって定義されます)。 声明)。

    MSTVFもBEGINを使用します / END 構文。これは、ITVFと区別するもう1つの点です(ITVFはその構文を使用しません)。

    マルチステートメントテーブル値関数の例

    基本的なMSTVFの例を次に示します。

    CREATE FUNCTION dbo.udf_PetsByName_MSTVF( @PetName varchar(70))
        RETURNS @pets TABLE (
            PetId varchar(20),
            PetName varchar(70)
        )
    AS
    BEGIN
        INSERT INTO @pets
        SELECT 
            CONCAT('Cat', ' ', CatId),
            CatName
        FROM dbo.Cats
        WHERE CatName = @PetName;
    
        INSERT INTO @pets
        SELECT 
            CONCAT('Dog', ' ', DogId),
            DogName
        FROM dbo.Dogs
        WHERE DogName = @PetName;
    
        IF @@ROWCOUNT = 0
        BEGIN
            INSERT INTO @pets
            VALUES (
                '',
                'There are no pets of that name.'
                )
        END
    
        RETURN;
    END;
    
    GO
    

    ここでは、@petsという戻り変数を定義することから関数を開始します。 。タイプはテーブルです 、および2つの列を返します。

    この場合、2つのSELECTがあります ステートメントとIF 声明。それぞれの結果は、戻り変数に格納されます。これは、INSERTを介して行われます。 毎回ステートメント。

    機能オプション

    スキーマバインディングを使用するかどうか(おそらく使用する必要があります)、関数を暗号化するかどうかなどを指定することもできます。

    スキーマバインディングは、関数が依存する基になるオブジェクトに不利な変更が行われるのを防ぎます(テーブルの削除、列の変更など)。

    暗号化は、関数の定義を難読化された形式に変換します(他の人がそれを読み取れないようにするため)。

    ITVFにスキーマバインディングと暗号化を追加する例については、複数値のテーブル値関数の作成を参照してください。


    1. Postgresエラー:読み取り用にファイルを開くことができませんでした:アクセスが拒否されました

    2. SQL ONUPDATECASCADEでエラーが発生し続ける

    3. PostgreSQLクエリキャッシングと負荷分散の概要

    4. LinuxのコマンドラインからMySQLデータベースをバックアップする方法