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

SQL Serverでインラインテーブル値関数(ITVF)を作成する

    T-SQL CREATE FUNCTIONを使用して、SQL Serverでインラインテーブル値関数(ITVF)を作成できます。 構文。

    構文

    インラインTVFの公式構文は次のとおりです。

    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 [ ) ]  
    [ ; ]  
    

    例1-基本的なITVF

    これは、基本的なインラインテーブル値関数の例です。

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

    この場合、関数では猫の名前を引数として渡す必要があります。次に、関連するデータを返すために、クエリでこの引数を使用します。

    例2–スキーマバインディングの追加

    通常は、SCHEMABINDINGを使用して関数をスキーマバインドすることをお勧めします。 口論。

    これを行うと、関数に影響を与えるような方法で基になるテーブルを変更できないようになります。

    スキーマバインディングがないと、基になるテーブルが変更されたり、削除されたりする可能性があります。これを行うと、機能が損なわれる可能性があります。

    これは同じ関数ですが、今回はスキーマバインディングを使用します:

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

    クエリでテーブルを参照するときに2つの部分からなる名前を使用したことに注意してください(dbo.Catsを使用しました) Catsだけでなく、テーブルを参照する場合 )。これを行うことは、オブジェクトをバインドするスキーマの要件です。 2つの部分からなる名前を使用せずにオブジェクトをスキーマバインドしようとすると、エラーが発生します。

    関数をスキーマバインドしたので、その定義で参照されているテーブルを削除しようとすると、エラーが発生します:

    DROP TABLE Cats;
    

    結果:

    Msg 3729, Level 16, State 1, Line 1
    Cannot DROP TABLE 'cats' because it is being referenced by object 'udf_CatsByName_ITVF'.
    

    ちなみに、2つの部分からなる名前を使用せずに関数を作成しようとすると、次のようになります。

    CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) )
        RETURNS TABLE
        WITH SCHEMABINDING
    AS
    RETURN (
        SELECT 
            CatId,
            CatName,
            Phone
        FROM Cats
        WHERE CatName = @CatName
        );
    
    GO
    
    を使用してテーブルを返します。

    結果:

    Msg 4512, Level 16, State 3, Procedure udf_CatsByName_ITVF, Line 7
    Cannot schema bind table valued function 'dbo.udf_CatsByName_ITVF' because name 'Cats' is invalid for schema binding. Names must be in two-part format and an object cannot reference itself.
    

    例3–暗号化の追加

    ENCRYPTIONを使用して関数を暗号化することもできます 口論。

    関数を暗号化する例を次に示します。

    CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) )
        RETURNS TABLE
        WITH SCHEMABINDING, ENCRYPTION
    AS
    RETURN (
        SELECT 
            CatId,
            CatName,
            Phone
        FROM dbo.Cats
        WHERE CatName = @CatName
        );
    
    GO
    
    を含むテーブルを返します。

    関数の定義を表示できなくなりました。

    SELECT definition 
    FROM sys.sql_modules
    WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
    

    結果:

    +--------------+
    | definition   |
    |--------------|
    | NULL         |
    +--------------+
    

    Azure Data Studioを介して関数の定義をスクリプト化しようとすると、エラーメッセージも表示されます。

    No script was returned when scripting as Create on object UserDefinedFunction
    

    暗号化された関数のテキストは、DACポートを介してシステムテーブルにアクセスするか、データベースファイルに直接アクセスできる特権ユーザーが引き続き利用できることに注意してください。また、デバッガーをサーバープロセスに接続できるユーザーは、実行時にメモリから元のプロシージャを取得できます。


    1. MySQLの複数のテーブルからのCOUNT(*)

    2. MySQLでVALUESステートメントを使用する場合の「エラー3942(HY000):VALUES句の各行には少なくとも1つの列が必要」を修正

    3. ORA-12705:NLSデータ・ファイルまたは無効な環境にアクセスできません

    4. ClusterControl-高度なバックアップ管理-mariabackupパートII