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

SQLServerでスキーマバインドUDFを作成する

    SQL Serverでは、通常、ユーザー定義関数(UDF)をスキーマバインドすることをお勧めします。

    UDFをスキーマバインドすると、関数に影響を与えるような方法で基になるテーブルを変更できないようになります。スキーマバインディングがないと、基になるテーブルやその他のオブジェクトが変更されたり、削除されたりする可能性があります。これを行うと、機能が損なわれる可能性があります。

    スキーマにバインドされたUDFを作成するには、WITH SCHEMABINDINGを使用します 関数を作成するためのT-SQLコードで。これは、関数がスカラー関数であるかテーブル値関数(TVF)であるかに関係なく適用されます。

    いずれにせよ、インラインTVF、マルチステートメントTVF、およびスカラー関数の例を含めました。

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

    スキーマバインディングを使用してインラインTVFを作成する例を次に示します。

    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.
    

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

    マルチステートメントTVFでは、WITH SCHEMABINDINGを配置します 戻り変数の指定後。

    CREATE FUNCTION dbo.udf_PetsByName_MSTVF( @PetName varchar(70))
        RETURNS @pets TABLE (
            PetId varchar(20),
            PetName varchar(70)
        )
        WITH SCHEMABINDING
    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
    

    例3–スカラー関数

    スカラー関数の例を次に示します。

    CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int)  
    RETURNS smallint
    WITH SCHEMABINDING
    AS  
    BEGIN
        DECLARE @AlbumCount int;
        SELECT @AlbumCount = COUNT(AlbumId)
        FROM dbo.Albums
        WHERE ArtistId = @ArtistId; 
        RETURN @AlbumCount;
    END;
    
    GO
    

    例4–複数の引数の追加

    複数の引数をコンマ区切りのリストとして指定できます。たとえば、スキーマバインディングをおよび指定する場合 暗号化する場合は、これらをカンマ区切りのリストとして追加する必要があります。

    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
    
    を含むテーブルを返します。
    1. グループ化された現在の合計のための最良のアプローチ

    2. 2つの日付の間の月曜日を検索

    3. SQLite Total()のしくみ

    4. 日付データ型のEquals(=)とLIKE