В SQL Server, вградената функция със стойност на таблица е един от двата типа функции с таблична стойност на Transact-SQL (другият тип е функцията с таблична стойност с множество изрази).
Функциите с таблично стойности (TVF) са тип дефинирана от потребителя функция, която връща резултатите си като таблица. Следователно те могат да бъдат запитани точно като нормална таблица.
Вградените TVF (понякога наричани ITVF) нямат свързани променливи за връщане. Връщаната стойност се дефинира чрез единичен SELECT
изявление. Този израз дефинира структурата на таблицата за връщане. Това е в контраст с TVF с множество оператори (наричани още MSTVF), които изискват връщаща променлива.
ITVF също не използват BEGIN
/END
синтаксис, което е друго нещо, което ги отличава от MSTVF.
Често се смята, че вградените TVF имат по-добра производителност в сравнение с TVF с множество оператори, въпреки че това също ще зависи от това, което се опитвате да направите във функцията.
Пример за вградена функция с таблично стойност
Ето пример за основен ITVF:
CREATE FUNCTION dbo.ufn_AlbumsByArtist(@ArtistId int) RETURNS TABLE AS RETURN ( SELECT al.ArtistId, al.AlbumName, g.Genre FROM dbo.Albums al INNER JOIN dbo.Artists ar ON al.ArtistId = ar.ArtistId INNER JOIN Genres g ON al.GenreId = g.GenreId WHERE al.ArtistId = @ArtistId ); GO
Основно се състои от SELECT
изявление, увито в някакъв друг код. За да го направите специално вграден TVF, стартирах функцията с RETURNS TABLE
, следван отблизо от RETURN
и завършващи с SELECT
израз в скоби.
Множество изявления
Въпреки че вградените функции със стойности на таблица не са проектирани за множество SELECT
изрази (за това са MSTVF), е възможно да се използва UNION
оператор за комбиниране на резултатния набор от множество изрази.
Пример:
CREATE FUNCTION [dbo].[udf_PetsByName_ITVF]( @PetName varchar(70)) RETURNS TABLE AS RETURN ( SELECT CONCAT('Cat', ' ', CatId) AS PetId, CatName FROM dbo.Cats WHERE CatName = @PetName UNION ALL SELECT CONCAT('Dog', ' ', DogId) AS PetId, DogName FROM dbo.Dogs WHERE DogName = @PetName ); GO
Опции за функции
Можете също да посочите неща като дали да използвате или не свързване на схема (вероятно трябва) и дали да шифровате функцията или не.
Обвързването на схемата ще предотврати извършването на всякакви неблагоприятни промени в основните обекти, от които зависи функцията (като отпадане на таблица, промяна на колона и т.н.).
Шифроването ще преобразува дефиницията на функцията в обфускиран формат (за да попречи на другите да могат да я прочетат).
Вижте Създаване на вградена функция с стойност на таблица за примери за добавяне на обвързване на схема и криптиране към ITVF.