V SQL Server můžete vytvořit skalární uživatelem definovanou funkci pomocí CREATE FUNCTION
prohlášení. Skalární uživatelsky definovaná funkce, jinak známá jako skalární UDF, je uživatelem definovaná funkce, která vrací jednu hodnotu.
Tento článek obsahuje příklady vytváření některých základních skalárních UDF T-SQL.
Syntaxe
Nejprve se podívejme na syntaxi pro vytváření skalárních UDF.
Syntaxe pro skalární UDF T-SQL vypadá takto:
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] název_funkce ( [ { @název_parametru [ AS ][ název_schéma_typu. ] typ_dat_parametru [ =výchozí ] [ POUZE PRO ČTENÍ ] } [ ,...n ] ] ) VRÁTÍ return_data_type [ S[ ,...n ] ] [ AS ] BEGIN tělo_funkce RETURN skalární_výraz END [; ]
A syntaxe pro skalární UDF CLR:
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name ( { @parameter_name [AS] [ type_schema_name. ] parameter_data_type [ =default ] } [ ,...n ] ) RETURNS { return_data_type } [ WITH[ ,...n ] ] [ AS ] EXTERNÍ NÁZEV [; ]
Části v <function_option>
pro funkce T-SQL a <clr_function_option>
pro funkce CLR umožňují zadat volby pro UDF. Možnosti funkcí zahrnují přidání šifrování, vazby schématu, EXECUTE AS
klauzule a také určení, co dělat, když je jako argument předána hodnota NULL.
Úplný seznam argumentů a možností funkcí lze nalézt na webu společnosti Microsoft.
Dokumentace společnosti Microsoft obsahuje mnoho podrobností, takže následující příklady jsou zaměřeny na poskytnutí rychlého přehledu některých běžných konceptů a možností při vytváření skalárních UDF.
Příklad 1 – Základní skalární UDF
Zde je příklad kódu použitého k vytvoření základního skalárního UDF T-SQL.
VYTVOŘIT FUNKCI dbo.ufn_discountPrice( @price DECIMAL(12,2), @discount DECIMAL(12,2) ) VRÁCENÍ DESETINNÉ (12,2)ASBEGIN RETURN @price * (1 - @sleva);END;Tento skalární UDF přijímá dva parametry;
@price
a@discount
. Tyto jsou předány funkci jako argumenty při každém vyvolání funkce. Funkce převezme hodnotu těchto argumentů, provede výpočet pomocí těchto hodnot a poté vrátí výslednou hodnotu. V tomto případě je vrácena zlevněná cena.Příklad 2 – Vyvolání UDF
Jakmile je UDF vytvořeno, lze jej kdykoli vyvolat v kódu T-SQL.
Zde je příklad vyvolání UDF:
SELECT dbo.ufn_discountPrice(100, .2) AS Result;Výsledek
+-----------+| Výsledek ||-----------|| 80,00 |+----------+Příklad 3 – Dotazování tabulky
Skalární UDF mohou také dělat věci, jako jsou dotazovací databázové tabulky.
Zde je jeden, který vrací počet alb, která jsou v databázi daného interpreta.
VYTVOŘIT FUNKCI dbo.ufn_CountAlbums (@ArtistId int) VRÁTKY smallintAS ZAČÁT DECLARE @AlbumCount int; SELECT @AlbumCount =COUNT(AlbumId) FROM Alba WHERE ArtistId =@ArtistId; RETURN @AlbumCount;END;Toto je skalární funkce, protože vrací jednu hodnotu. Pokud bychom chtěli vrátit seznam alb, museli bychom použít funkci s tabulkovou hodnotou, protože funkce s tabulkovou hodnotou vracejí výsledky jako sadu řádků.
Příklad 4 – Vazba schématu
Když vytvoříte uživatelem definovanou funkci, která závisí na jiných objektech v databázi, je obvykle dobré schéma UDF svázat. Vazba schématu UDF zajišťuje, že nelze provést žádné změny na základních objektech, které by mohly potenciálně ovlivnit funkci.
Například byste nemohli zrušit tabulku, kterou UDF vázané na schéma používá ve své definici.
Chcete-li schéma svázat UDF, použijte
WITH SCHEMABINDING
ve své definici. Pro všechny objekty, na které se odkazuje v UDF, musíte také použít dvoudílné názvy.Zde je předchozí příklad přepsaný tak, aby byl vázaný na schéma:
VYTVOŘIT FUNKCI dbo.ufn_CountAlbums (@ArtistId int) VRACÍ smallintWITH SCHEMABINDINGAS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount =COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId =@ArtistId; RETURN @AlbumCount;END;Změnil jsem tedy dvě věci oproti prvnímu příkladu. Přidal jsem
WITH SCHEMABINDING
a změnil jsemAlbums
nadbo.Albums
.Pokud se nyní někdo pokusí tuto tabulku zahodit nebo v ní provést jiné změny, zobrazí se mu chyba.
Příklad 5 – Šifrování
Můžete také použít
WITH ENCRYPTION
k zašifrování funkce.VYTVOŘIT FUNKCI dbo.ufn_CountAlbums (@ArtistId int) VRÁTKY smallintWITH ŠIFROVÁNÍ ZAČNĚTE DECLARE @AlbumCount int; SELECT @AlbumCount =COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId =@ArtistId; RETURN @AlbumCount;END;Příklad 6 – Vstup NULL
Pokud je při vyvolání funkce některý z argumentů NULL, tělo funkce se stále provede. To znamená, pokud jste výslovně neuvedli
RETURNS NULL ON NULL INPUT
v definici funkce.Zadání této možnosti vrátí hodnotu NULL, pokud je některý z argumentů NULL.
VYTVOŘIT FUNKCI dbo.ufn_CountAlbums (@ArtistId int) VRÁTÍ smallintWITH VRÁTÍ NULL NA NULL VSTUPY ZAČNĚTE DECLARE @AlbumCount int; SELECT @AlbumCount =COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId =@ArtistId; RETURN @AlbumCount;END;Když funkci vyvolám pomocí NULL jako argument:
SELECT dbo.ufn_CountAlbums(NULL) AS Result;Dostanu jiný výsledek v závislosti na tom, co jsem pro tuto možnost uvedl.
Zde je výsledek, když funkce používá výchozí nastavení (
CALLED ON NULL INPUT
):+-----------+| Výsledek ||-----------|| 0 |+----------+A tady je výsledek, když používá
RETURNS NULL ON NULL INPUT
:+-----------+| Výsledek ||-----------|| NULL |+----------+Příklad 7 – Více možností
Více možností můžete oddělit čárkou.
Zde je příklad, který k funkci přidává šifrování i vazbu schématu:
CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int) SE VRACÍ smallintWITH ŠIFROVÁNÍ, SCHEMABINDINGAS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount =COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId =@ArtistId; RETURN @AlbumCount;END;Příklad 8 – Změna funkce
Skalární UDF můžete změnit nahrazením
CREATE
pomocíALTER
.ALTER FUNCTION dbo.ufn_CountAlbums (@ArtistId int) SE VRACÍ smallintWITH SCHEMABINDINGAS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount =COUNT(AlbumId) FROM dbo.Albums WHERE ArtistId =@ArtistId; RETURN @AlbumCount;END;