sql >> Databasteknik >  >> RDS >> Sqlserver

Skapa en schemabunden UDF i SQL Server

I SQL Server är det vanligtvis en bra idé att schemabinda dina användardefinierade funktioner (UDF).

Schema som binder din UDF kommer att säkerställa att de underliggande tabellerna inte kan ändras på ett sätt som skulle påverka din funktion. Utan schemabindning kan de underliggande tabellerna eller andra objekt ändras eller till och med tas bort. Om du gör detta kan funktionen bryta.

För att skapa en schemabunden UDF, använd WITH SCHEMABINDING i din T-SQL-kod för att skapa funktionen. Detta gäller oavsett om funktionen är en skalär funktion eller en tabellvärderad funktion (TVF).

Jag har i alla fall inkluderat exempel på en inline TVF, en multi-statement TVF och en skalär funktion.

Exempel 1 – Inline tabellvärderad funktion

Här är ett exempel på hur du skapar en inline TVF med schemabindning:

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

Observera att jag använde det tvådelade namnet när jag refererade till tabellen i min fråga (jag använde dbo.Cats när du hänvisar till tabellen, istället för bara Cats ). Att göra detta är ett krav för att schemabinda ett objekt. Om du försöker schemalägga ett objekt utan att använda tvådelade namn får du ett felmeddelande.

Nu när jag har schemalagt min funktion, om jag försöker ta bort tabellen som refereras till i dess definition, får jag ett felmeddelande:

DROP TABLE Cats;

Resultat:

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

Här är vad som händer om jag försöker skapa funktionen utan att använda tvådelad namngivning:

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

Resultat:

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.

Exempel 2 – Multi-Statement Tabell-värderad funktion

Med TVF:er med flera påståenden placerar du WITH SCHEMABINDING efter returvariabelspecifikationen.

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

Exempel 3 – Skalär funktion

Här är ett exempel på en skalär funktion:

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

Exempel 4 – Lägga till flera argument

Du kan ange flera argument som en kommaseparerad lista. Till exempel, om du vill ange schemabindning och kryptering måste du lägga till dessa som en kommaseparerad lista.

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. Hantera fel med hög allvarlighet i SQL Server

  2. Kontrollera om ett objekt är en tabell, vy eller lagrad procedur i SQL Server med funktionen OBJECTPROPERTY()

  3. Vilka resurser finns för justering av databasprestanda?

  4. KONTROLLERA begränsningar i SQL Server