sql >> Databáze >  >> RDS >> Sqlserver

Vytvořte skalární uživatelem definovanou funkci v SQL Server

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 jsem Albums na dbo.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;

  1. Rekurzivní subdotazování s řazením

  2. Jak použít MAX() na výsledek dílčího dotazu?

  3. Aggregate String Concatenation v Oracle 10g

  4. Funkce vs uložené procedury