sql >> Databasteknik >  >> RDS >> Sqlserver

Ta bort SCHEMABINDING från en användardefinierad funktion i SQL Server

Syftet med att schemabinda en användardefinierad funktion (UDF) är att säkerställa att basobjekten som refereras till i UDF inte kan modifieras på ett sätt som skulle påverka funktionens definition.

Detta är bra, så länge du inte behöver göra några ändringar i de underliggande objekten. Men vad händer om du behöver göra ändringar?

Du kan ta bort schemabindning från en UDF, göra ändringarna i basobjektet/en och sedan tillämpa schemabindning igen.

Det finns två sätt att ta bort bindningen av en användardefinierad funktion till dess basobjekt:

  • Ändra funktionen så att dess definition inte längre anger schemabindning.
  • Släpp funktionen (återskapa den sedan utan schemabindning om det behövs).

Exempel på en schemabunden funktion

Först, här är ett exempel på en schemabunden 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;

Vi vet att det är en schemabunden funktion eftersom den innehåller WITH SCHEMABINDING i sin definition. För att ta bort schemabindning behöver vi bara ta bort den biten.

Alternativ 1 – Ändra funktionen

För att ta bort schemabindning från den här funktionen genom att ändra den, kan vi använda följande kod:

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

Allt vi gjorde var att ändra CREATE till ALTER , och ta bort WITH SCHEMABINDING .

Alternativ 2 – Släpp funktionen

Här är ett exempel på att ta bort funktionen och sedan återskapa den utan schemabindning:

DROP FUNCTION IF EXISTS dbo.ufn_CountAlbums;
GO

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

I det här fallet använde jag syntaxen DROP IF EXISTS, som förhindrar att ett fel uppstår om funktionen inte existerar.


  1. Oracle Lås &bordslås:Hur det fungerar

  2. Entity-framework-koden är långsam när du använder Include() många gånger

  3. Beräkna antalet samtidiga händelser i SQL

  4. Hur man konverterar Unix-epok till en tidsstämpel