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

SQLServerのマルチステートメントテーブル値関数とインラインテーブル値関数の違い

    SQL Serverでテーブル値関数(TVF)を作成する場合、インラインテーブル値関数(ITVF)またはマルチステートメントテーブル値関数(MSTVF)のいずれかにすることができます。これらの関数タイプには違いがあり、それに応じて異なる構文を使用します。

    この記事では、MSTVFとITVFの違いについて説明します。

    違い

    MSTVFとITVFの主な違いは次のとおりです。

    ITVF MSTVF
    RETURNS構文 あなたは単にRETURNS TABLEと述べます 戻りテーブルの定義は、関数のSELECTに基づきます。 声明。戻りテーブルの構造を指定する必要はありません。 あなたのRETURNS 構文は、戻りテーブルの構造を明示的に指定します。これは、関数の値として返される行を格納および累積するために使用されるTABLE変数を宣言することによって行われます。
    BEGIN/END構文 ITVFはBEGINを使用しません / END 構文。 MSTVFはBEGINを使用します / END 構文。
    パフォーマンス 一般的にMTSVFよりも高速です。 一般的にITVFよりも低速です。
    データの更新 場合によっては、ITFVを使用して基になるテーブルのデータを更新することが可能です。 MSTVFを使用して基になるテーブルのデータを更新することはできません。

    構文

    各関数型の構文の違いを見てみましょう。

    インラインテーブル値関数

    CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
    ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type   
        [ = default ] [ READONLY ] }   
        [ ,...n ]  
      ]  
    )  
    RETURNS TABLE  
        [ WITH <function_option> [ ,...n ] ]  
        [ AS ]  
        RETURN [ ( ] select_stmt [ ) ]  
    [ ; ]  
    

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

    CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
    ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type   
        [ = default ] [READONLY] }   
        [ ,...n ]  
      ]  
    )  
    RETURNS @return_variable TABLE <table_type_definition>  
        [ WITH <function_option> [ ,...n ] ]  
        [ AS ]  
        BEGIN   
            function_body   
            RETURN  
        END  
    [ ; ]
    

    MSTVFはテーブル定義で始まりますが、ITVFにはそのような定義がないことに注意してください。

    MSTVFはRETURNS @return_variable TABLEで始まります その後にテーブル定義が続きます。ここでは、@return_variable はTABLE変数であり、関数の値として返される行を格納および累積するために使用されます。

    例1-インラインテーブル値関数

    簡単なITVFの例を次に示します。

    CREATE FUNCTION 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
    

    ここでは、UNION ALLを使用して2つのテーブルから選択します 、関数は単に結果を返します。

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

    これは、MSTVFを使用して同じことを行う例ですが、方法が異なります。

    CREATE FUNCTION 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;
    
        RETURN;
    END;
    
    GO
    

    この関数は、@petsというTABLE変数を宣言することから始まります。 。これを行う際に、戻りテーブルの構造を明示的に指定します。

    BEGIN内のクエリ / END ブロックは@petsというTABLE変数に保存されます 。

    この場合、UNION ALLを使用しないことを選択しました 。代わりに、ステートメントを個別に実行し、各ステートメントの結果を@petsに保存しました。 変数。

    例3–MSTVFに別のステートメントを追加する

    MSTVFの「マルチステートメント」の側面をさらに示すために、上記のMSTVFにステートメントを追加して、結果を同じ戻り変数に保存できます。

    例:

    CREATE FUNCTION 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
    

    この場合、クエリの結果、行が返されない場合は常に特別なメッセージを返すコードを追加しました。


    1. テーブルは「読み取り専用」です

    2. AndroidSQLiteデータベーステーブルが作成されていません

    3. アイテムが別のテーブルに存在しないかどうかを確認する

    4. SQL ServerはWebリクエストを送信できますか?