sql >> Database teknologi >  >> RDS >> Sqlserver

Fjern SCHEMABINDING fra en brugerdefineret funktion i SQL Server

Formålet med skemabinding af en brugerdefineret funktion (UDF) er at sikre, at de basisobjekter, der refereres til i UDF'en, ikke kan ændres på en måde, der ville påvirke funktionens definition.

Dette er fint, så længe du ikke behøver at foretage ændringer i de underliggende objekter. Men hvad hvis du har brug for at foretage ændringer?

Du kan fjerne skemabinding fra en UDF, foretage ændringerne af basisobjektet/-erne og derefter genanvende skemabinding.

Der er to måder at fjerne bindingen af ​​en brugerdefineret funktion til dens basisobjekter:

  • Rediger funktionen, så dens definition ikke længere specificerer skemabinding.
  • Slip funktionen (så genskab den uden skemabinding, hvis det er nødvendigt).

Eksempel på en skemabundet funktion

For det første er her et eksempel på en skemabundet 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 ved, at det er en skemabundet funktion, fordi den indeholder WITH SCHEMABINDING i sin definition. For at fjerne skemabinding er alt, hvad vi skal gøre, at fjerne den bit.

Mulighed 1 – Skift funktionen

For at fjerne skemabinding fra denne funktion ved at ændre den, kan vi bruge følgende kode:

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;

Det eneste, vi gjorde, var at ændre CREATE til ALTER , og fjern WITH SCHEMABINDING .

Mulighed 2 – Slip funktionen

Her er et eksempel på at droppe funktionen og derefter genskabe den uden skemabinding:

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 dette tilfælde brugte jeg DROP IF EXISTS-syntaksen, som forhindrer en fejl i at opstå i tilfælde af, at funktionen ikke eksisterer.


  1. Postgresql-udtræk sidste række for hvert id

  2. Vent Statistics and Query Store

  3. JSON_ARRAYAGG() Funktion i Oracle

  4. SQLite IN