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

SQL Serverのテーブル値関数とは何ですか?

    SQL Serverでは、テーブル値関数 (TVF)は、テーブルを返すユーザー定義関数です。これは、単一の値を返すスカラー関数とは対照的です。

    テーブルをクエリするのと同じ方法で、テーブル値関数を呼び出すことができます。たとえば、SELECTで使用できます 声明。場合によっては、テーブル値関数を使用して、データを更新、削除、および挿入することもできます。

    テーブル値関数の種類

    テーブル値関数を作成するときは、Transact-SQLテーブル値関数または共通言語ランタイム(CLR)テーブル値関数を作成することを選択できます。

    Transact-SQLテーブル値関数

    Transact-SQL TVFは、次のいずれかになります。

    インラインテーブル値関数(ITVF)
    ITVFを作成するときは、関数の定義をRETURNS TABLEで開始します。 、および後続のSELECT ステートメントは、戻りテーブルの構造を定義します。
    マルチステートメントテーブル値関数(MSTVF)
    マルチステートメントのテーブル値関数には複数のステートメントを含めることができ、その結果は関数の開始時に宣言する変数に保存されます。これを行うときは、戻りテーブルの構造を明示的に指定します。

    CLRテーブル値関数

    CLRの観点からは、構文はT-SQL ITVFに似ていますが、わずかに異なります。戻りテーブルの構造を明示的に指定しますが、戻り変数を宣言しません。

    CLRテーブル値関数は、Microsoft.NETFrameworkアセンブリのクラスのメソッドとして実装されます。

    CLR TVFの詳細な概要については、CLRテーブル値関数に関するMicrosoftのドキュメントを参照してください。

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

    インラインテーブル値関数の作成に使用されるT-SQLコードの例を次に示します。

    CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) )
        RETURNS TABLE
    AS
    RETURN (
        SELECT 
            CatId,
            CatName,
            Phone
        FROM dbo.Cats
        WHERE CatName = @CatName
        );
    GO
    

    戻りテーブルの構造を指定していないため、これはインラインのテーブル値関数であることがわかります。 RETURNS TABLEとだけ記載されています 、次にSELECTに依存します 戻りテーブルの構造を決定するステートメント。

    この場合、関数では猫の名前を引数として渡す必要があります。

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

    スキーマバインディングは、関数が参照する基になるオブジェクトに不利な変更が加えられるのを防ぐため、通常は良い考えです。

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

    マルチステートメントのテーブル値関数にしたい場合は、次のように関数を記述します。

    CREATE FUNCTION udf_CatsByName_MSTVF( @CatName varchar(70) )
        RETURNS @cats TABLE (
            CatId int,
            CatName varchar(70),
            Phone varchar(10)
        )
    AS
    BEGIN
        INSERT INTO @cats
        SELECT 
            CatId,
            CatName,
            Phone
        FROM dbo.Cats
        WHERE CatName = @CatName;
    
        RETURN;
    END;
    GO
    

    この場合、タイプ tableの変数を使用します @catsと呼ばれます そして、戻りテーブルの構造を明示的に指定します。クエリ結果はその変数に保存され、関数が呼び出されたときに返されます。

    この例では、ステートメントが1つしかないため、MSTVFはあまり正当化されません。 MSTVFの主なポイントは、複数のステートメントを含めることができ、それらのステートメントの出力を戻り変数に追加できることです。

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

    例3–テーブル値関数からデータを選択

    関数を作成したので、SELECTを使用して両方を呼び出すことができます。 声明。

    SELECT * FROM udf_CatsByName_ITVF('Tom');
    SELECT * FROM udf_CatsByName_MSTVF('Tom');
    

    結果:

    +---------+-----------+------------+
    | CatId   | CatName   | Phone      |
    |---------+-----------+------------|
    | 3       | Tom       | 7871237652 |
    +---------+-----------+------------+
    (1 row affected)
    +---------+-----------+------------+
    | CatId   | CatName   | Phone      |
    |---------+-----------+------------|
    | 3       | Tom       | 7871237652 |
    +---------+-----------+------------+
    (1 row affected)
    

    ITVFとMSTVFの両方が同じ構文を使用して呼び出され、両方とも同じ結果を返しました。

    テーブル値関数の呼び出し

    FROMでテーブル式が許可されている場合は、テーブル値関数を呼び出すことができます。 SELECTの句 、INSERTUPDATE 、またはDELETE ステートメント。

    つまり、テーブル値関数を使用して、データの選択、データの挿入、データの更新、さらにはデータの削除を行うことができます。

    それぞれを示す記事は次のとおりです。

    • テーブル値関数を使用してデータを選択
    • テーブル値関数を介してデータを更新する
    • テーブル値関数を介してデータを挿入
    • テーブル値関数を使用してデータを削除する

    1. バックエンドデータベースが非同期的に変更されたときにJPAエンティティを更新するにはどうすればよいですか?

    2. PHPのPDOを介してMySQLクエリをループするにはどうすればよいですか?

    3. PostgreSQLでONCONFLICTを使用してRETURNINGを使用するにはどうすればよいですか?

    4. インストール時にアプリケーションがクラッシュし、エラーsqlite3_exec-同期モードの設定に失敗しました=1(通常)