I SQL Server kan du skapa en skalär användardefinierad funktion med CREATE FUNCTION
påstående. En skalär användardefinierad funktion, även känd som en skalär UDF, är en användardefinierad funktion som returnerar ett enda värde.
Den här artikeln innehåller exempel på hur du skapar några grundläggande T-SQL-skalära UDF:er.
Syntax
Låt oss först titta på syntaxen för att skapa skalära UDF:er.
Syntaxen för T-SQL skalära UDF:er ser ut så här:
SKAPA [ ELLER ÄNDRA ] FUNKTION [ schema_namn. ] funktionsnamn ( [ { @parameter_namn [ AS ][ typ_schema_namn. ] parameter_data_type [ =default ] [ LÄSENDAST ] } [ ,...n ] ] ) RETURNERAR return_data_type [ MED[ ,...n ] ] [ AS ] BEGIN function_body RETURN scalar_expression END [; ]
Och syntaxen för CLR-skalära UDF:er:
SKAPA [ ELLER ÄNDRA ] FUNKTION [ schema_namn. ] function_name ( { @parameter_name [AS] [ typ_schema_name. ] parameter_data_type [ =default ] } [ ,...n ] ) RETURNERAR { return_data_type } [ MED[ ,...n ] ] [AS ] EXTERNT NAMN [; ]
Delarna på <function_option>
för T-SQL-funktioner och <clr_function_option>
för CLR-funktioner kan du ange alternativ för UDF. Funktionsalternativ inkluderar att lägga till kryptering, schemabindning, en EXECUTE AS
sats, samt specificera vad som ska göras när ett NULL-värde skickas som ett argument.
En fullständig lista över argument och funktionsalternativ finns på Microsofts webbplats.
Microsofts dokumentation innehåller mycket detaljer, så följande exempel syftar till att ge en snabb översikt över några vanliga koncept och alternativ när du skapar skalära UDF:er.
Exempel 1 – Grundläggande skalär UDF
Här är ett exempel på koden som används för att skapa en grundläggande T-SQL-skalär UDF.
SKAPA FUNKTION dbo.ufn_discountPrice( @price DECIMAL(12,2), @rabatt DECIMAL(12,2) ) RETURER DECIMAL (12,2)SOM BÖRJAN RETUR @price * (1 - @rabatt);END;Denna skalära UDF accepterar två parametrar;
@price
och@discount
. Dessa skickas in i funktionen som argument närhelst funktionen anropas. Funktionen tar värdet av dessa argument, utför en beräkning med dessa värden och returnerar sedan det resulterande värdet. I detta fall returneras det rabatterade priset.Exempel 2 – Anropa UDF
När UDF har skapats kan den anropas inom T-SQL-kod när du behöver den.
Här är ett exempel på att anropa UDF:
VÄLJ dbo.ufn_discountPrice(100, .2) SOM Resultat;Resultat
+----------+| Resultat ||--------|| 80,00 |+----------+Exempel 3 – Fråga efter en tabell
Skalära UDF:er kan också göra saker som frågedatabastabeller.
Här är en som returnerar antalet album som finns i databasen för en given artist.
SKAPA FUNKTION dbo.ufn_CountAlbums (@ArtistId int) ÅTERGÅR smallintAS BÖRJA DEKLARERA @AlbumCount int; SELECT @AlbumCount =COUNT(AlbumId) FROM Albums WHERE ArtistId =@ArtistId; RETURN @AlbumCount;END;Detta är en skalär funktion eftersom den returnerar ett enda värde. Om vi ville returnera en lista med album, skulle vi behöva använda en tabellvärderad funktion, eftersom tabellvärdade funktioner returnerar dess resultat som en uppsättning rader.
Exempel 4 – Schemabindning
När du skapar en användardefinierad funktion som beror på andra objekt i databasen, är det vanligtvis en bra idé att schemabinda UDF. Schema som binder UDF säkerställer att inga ändringar kan göras på de underliggande objekten som potentiellt kan påverka funktionen.
Till exempel skulle du inte kunna släppa en tabell som en schemabunden UDF använder i sin definition.
För att schemalägga binda en UDF, använd
WITH SCHEMABINDING
i sin definition. Du måste också använda tvådelade namn för alla objekt som refereras till i UDF.Här är det tidigare exemplet omskrivet så att det är schemabundet:
SKAPA FUNKTION dbo.ufn_CountAlbums (@ArtistId int) ÅTERGÅR smallintWITH SCHEMABINDINGAS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount =COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId =@ArtistId; RETURN @AlbumCount;END;Så jag ändrade två saker från det första exemplet. Jag lade till
WITH SCHEMABINDING
, och jag ändradeAlbums
tilldbo.Albums
.Om någon nu försöker ta bort den tabellen eller göra andra ändringar i den får de ett felmeddelande.
Exempel 5 – Kryptering
Du kan också använda
WITH ENCRYPTION
för att kryptera funktionen.SKAPA FUNKTION dbo.ufn_CountAlbums (@ArtistId int) ÅTERGÅR smallint MED KRYPTERINGAR BÖRJA DEKLARERA @AlbumCount int; SELECT @AlbumCount =COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId =@ArtistId; RETURN @AlbumCount;END;Exempel 6 – NULL-ingång
När funktionen anropas, om något av argumenten är NULL, exekveras fortfarande funktionens kropp. Det vill säga, om du inte uttryckligen har angett
RETURNS NULL ON NULL INPUT
i funktionens definition.Om du anger det alternativet returneras NULL om något av argumenten är NULL.
SKAPA FUNKTION dbo.ufn_CountAlbums (@ArtistId int) ÅTERGÅR smallintWITH RETURNER NULL PÅ NULL INPUTAS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount =COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId =@ArtistId; RETURN @AlbumCount;END;När jag anropar funktionen med NULL som argument:
VÄLJ dbo.ufn_CountAlbums(NULL) SOM Resultat;Jag får ett annat resultat, beroende på vad jag har angett för det här alternativet.
Här är resultatet när funktionen använder standardinställningen (
CALLED ON NULL INPUT
):+----------+| Resultat ||--------|| 0 |+----------+Och här är resultatet när den använder
RETURNS NULL ON NULL INPUT
:+----------+| Resultat ||--------|| NULL |+----------+Exempel 7 – Flera alternativ
Du kan separera flera alternativ med ett kommatecken.
Här är ett exempel som lägger till både kryptering och schemabindning till funktionen:
SKAPA FUNKTION dbo.ufn_CountAlbums (@ArtistId int) ÅTERGÅR smallint MED KRYPTERING, SCHEMABINDINGAR BÖRJAR DECLARE @AlbumCount int; SELECT @AlbumCount =COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId =@ArtistId; RETURN @AlbumCount;END;Exempel 8 – Ändra en funktion
Du kan ändra en skalär UDF genom att ersätta
CREATE
medALTER
.ÄNDRA FUNKTION dbo.ufn_CountAlbums (@ArtistId int) ÅTERGÅR smallintWITH SCHEMABINDINGAS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount =COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId =@ArtistId; RETURN @AlbumCount;END;