In SQL Server kunt u een door de gebruiker gedefinieerde scalaire functie maken met behulp van de CREATE FUNCTION
uitspraak. Een scalaire door de gebruiker gedefinieerde functie, ook wel bekend als een scalaire UDF, is een door de gebruiker gedefinieerde functie die een enkele waarde retourneert.
Dit artikel bevat voorbeelden van het maken van enkele basis-T-SQL scalaire UDF's.
Syntaxis
Laten we eerst eens kijken naar de syntaxis voor het maken van scalaire UDF's.
De syntaxis voor T-SQL scalaire UDF's gaat als volgt:
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type [ = default ] [ READONLY ] } [ ,...n ] ] ) RETURNS return_data_type [ WITH <function_option> [ ,...n ] ] [ AS ] BEGIN function_body RETURN scalar_expression END [ ; ]
En de syntaxis voor CLR scalaire UDF's:
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name ( { @parameter_name [AS] [ type_schema_name. ] parameter_data_type [ = default ] } [ ,...n ] ) RETURNS { return_data_type } [ WITH <clr_function_option> [ ,...n ] ] [ AS ] EXTERNAL NAME[ ; ]
De onderdelen bij <function_option>
voor T-SQL-functies en <clr_function_option>
voor CLR-functies kunt u opties voor de UDF specificeren. Functie-opties omvatten het toevoegen van codering, schemabinding, een EXECUTE AS
clausule, evenals specificeren wat te doen wanneer een NULL-waarde als argument wordt doorgegeven.
Een volledige lijst met argumenten en functie-opties is te vinden op de Microsoft-website.
De Microsoft-documentatie bevat veel details, dus de volgende voorbeelden zijn bedoeld om een snel overzicht te geven van enkele algemene concepten en opties bij het maken van scalaire UDF's.
Voorbeeld 1 – Basis scalaire UDF
Hier is een voorbeeld van de code die wordt gebruikt om een standaard T-SQL scalaire UDF te maken.
CREATE FUNCTION dbo.ufn_discountPrice( @price DECIMAL(12,2), @discount DECIMAL(12,2) ) RETURNS DECIMAL (12,2) AS BEGIN RETURN @price * (1 - @discount); END;
Deze scalaire UDF accepteert twee parameters; @price
en @discount
. Deze worden als argumenten aan de functie doorgegeven wanneer de functie wordt aangeroepen. De functie neemt de waarde van die argumenten, voert een berekening uit met die waarden en retourneert vervolgens de resulterende waarde. In dit geval wordt de kortingsprijs geretourneerd.
Voorbeeld 2 – Roep de UDF op
Nadat de UDF is gemaakt, kan deze op elk gewenst moment binnen de T-SQL-code worden aangeroepen.
Hier is een voorbeeld van het aanroepen van de UDF:
SELECT dbo.ufn_discountPrice(100, .2) AS Result;
Resultaat
+----------+ | Result | |----------| | 80.00 | +----------+
Voorbeeld 3 – Een tabel opvragen
Scalaire UDF's kunnen ook dingen doen zoals databasetabellen opvragen.
Hier is er een die het aantal albums retourneert dat zich in de database voor een bepaalde artiest bevindt.
CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int) RETURNS smallint AS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount = COUNT(AlbumId) FROM Albums WHERE ArtistId = @ArtistId; RETURN @AlbumCount; END;
Dit is een scalaire functie omdat deze een enkele waarde retourneert. Als we een lijst met albums wilden retourneren, zouden we een functie met tabelwaarde moeten gebruiken, omdat functies met tabelwaarde de resultaten als een reeks rijen retourneren.
Voorbeeld 4 – Schemabinding
Wanneer u een door de gebruiker gedefinieerde functie maakt die afhankelijk is van andere objecten in de database, is het meestal een goed idee om de UDF schema te binden. Schemabinding aan de UDF zorgt ervoor dat er geen wijzigingen kunnen worden aangebracht aan de onderliggende objecten die mogelijk van invloed kunnen zijn op de functie.
U kunt bijvoorbeeld geen tabel verwijderen die een schemagebonden UDF in zijn definitie gebruikt.
Om een UDF schema te binden, gebruikt u WITH SCHEMABINDING
in zijn definitie. U moet ook tweedelige namen gebruiken voor alle objecten waarnaar in de UDF wordt verwezen.
Hier is het vorige voorbeeld herschreven zodat het schema gebonden is:
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;
Dus ik heb twee dingen veranderd ten opzichte van het eerste voorbeeld. Ik heb WITH SCHEMABINDING
. toegevoegd , en ik heb Albums
gewijzigd naar dbo.Albums
.
Als iemand nu probeert die tabel te laten vallen of er andere wijzigingen in aan te brengen, krijgt hij een foutmelding.
Voorbeeld 5 – Encryptie
Je kunt ook WITH ENCRYPTION
. gebruiken om de functie te versleutelen.
CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int) RETURNS smallint WITH ENCRYPTION AS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount = COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId = @ArtistId; RETURN @AlbumCount; END;
Voorbeeld 6 – NULL-invoer
Wanneer de functie wordt aangeroepen en een van de argumenten NULL is, wordt de hoofdtekst van de functie nog steeds uitgevoerd. Dat wil zeggen, tenzij u expliciet RETURNS NULL ON NULL INPUT
. heeft vermeld in de functiedefinitie.
Door die optie op te geven, wordt NULL geretourneerd als een van de argumenten NULL is.
CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int) RETURNS smallint WITH RETURNS NULL ON NULL INPUT AS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount = COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId = @ArtistId; RETURN @AlbumCount; END;
Als ik de functie aanroep met NULL als argument:
SELECT dbo.ufn_CountAlbums(NULL) AS Result;
Ik krijg een ander resultaat, afhankelijk van wat ik heb gespecificeerd voor deze optie.
Dit is het resultaat wanneer de functie de standaardinstelling gebruikt (CALLED ON NULL INPUT
):
+----------+ | Result | |----------| | 0 | +----------+
En hier is het resultaat wanneer het RETURNS NULL ON NULL INPUT
gebruikt :
+----------+ | Result | |----------| | NULL | +----------+
Voorbeeld 7 – Meerdere opties
U kunt meerdere opties scheiden met een komma.
Hier is een voorbeeld dat zowel codering als schemabinding aan de functie toevoegt:
CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int) RETURNS smallint WITH ENCRYPTION, SCHEMABINDING AS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount = COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId = @ArtistId; RETURN @AlbumCount; END;
Voorbeeld 8 – Een functie wijzigen
U kunt een scalaire UDF wijzigen door CREATE
. te vervangen met ALTER
.
ALTER 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;