sql >> Databasteknik >  >> RDS >> Sqlserver

Skapa en skalär användardefinierad funktion i SQL Server

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 ändrade Albums till dbo.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 med ALTER .

Ä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;

  1. Oracle External Table Exempel

  2. AVG() Funktion i MariaDB

  3. Fel vid skapande av tabell:Du har ett fel i din SQL-syntax nära 'order( order_id INT UNSIGNED NOT NULL AUTO_INCREMENT, user_id ' på rad 1

  4. Hur man genererar testdata i SQL Server