Можете да създадете вградена функция с таблица с стойност (ITVF) в SQL Server, като използвате T-SQL CREATE FUNCTION
синтаксис.
Синтаксис
Ето официалния синтаксис за вградени TVF.
СЪЗДАВАНЕ [ ИЛИ ПРОМЕНИ ] ФУНКЦИЯ [ име_на_схема. ] име_на_функция ( [ { @име_на_параметър [ AS ] [ type_schema_name. ] parameter_data_type [ =по подразбиране ] [ САМО ЧЕТЕНЕ ] } [ ,...n ] ] ) ВРЪЩА ТАБЛИЦА [ С <функция_опция> [ ,...n ] ] [ AS ] ВРЪЩАНЕ [ ( ] select_stmt [ ) ] [; ]
Пример 1 – Основен ITVF
Ето пример за основна вградена функция със стойност на таблица.
СЪЗДАВАНЕ НА ФУНКЦИЯ dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) ВРЪЩА TABLEASRETURN ( ИЗБЕРЕТЕ CatId, CatName, Phone ОТ dbo.Cats WHERE CatName =@CatName );GO
В този случай функцията изисква да се подаде име на котка като аргумент. След това използва този аргумент в заявката, за да върне съответните данни.
Пример 2 – Добавете обвързване на схема
Обикновено е добра идея да обвържете функциите си по схема, като използвате SCHEMABINDING
аргумент.
Това ще гарантира, че основните таблици не могат да бъдат променяни по начин, който би засегнал вашата функция.
Без обвързване на схемата, основните таблици могат да бъдат модифицирани или дори изтрити. Правейки това може да наруши функцията.
Ето същата функция, но този път с обвързване на схема:
СЪЗДАВАНЕ НА ФУНКЦИЯ dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) ВРЪЩА ТАБЛИЦА СЪС SCHEMABINDINGASRETURN ( ИЗБЕРЕТЕ CatId, CatName, Phone ОТ dbo.Cats WHERE CatName =@CatName );GO
Забележете, че използвах името от две части при препратка към таблицата в заявката си (използвах dbo.Cats
при препратка към таблицата, вместо само Cats
). Правенето на това е изискване за свързване на обект със схема. Ако се опитате да обвържете обект със схема, без да използвате имена от две части, ще получите грешка.
Сега, след като схемата обвърза функцията си, ако се опитам да пусна таблицата, посочена в нейната дефиниция, получавам грешка:
ПРОСТЪПНЕТЕ МАСА Котки;
Резултат:
Съобщение 3729, ниво 16, състояние 1, ред 1 не може да ИЗПУСКА ТАБЛИЦА 'cats', защото се препраща от обект 'udf_CatsByName_ITVF'.
Между другото, ето какво се случва, ако се опитам да създам функцията, без да използвам именуване от две части:
СЪЗДАВАНЕ НА ФУНКЦИЯ dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) ВРЪЩА ТАБЛИЦА СЪС SCHEMABINDINGASRETURN ( ИЗБЕРЕТЕ CatId, CatName, Phone FROM Cats WHERE CatName =@CatName );GO
Резултат:
Съобщение 4512, ниво 16, състояние 3, процедура udf_CatsByName_ITVF, ред 7 Не може да се обвърже схема със стойност на функцията 'dbo.udf_CatsByName_ITVF', тъй като името 'Cats' е невалидно за свързване на схема. Имената трябва да са във формат от две части и обектът не може да се позовава на себе си.
Пример 3 – Добавяне на криптиране
Можете също да шифровате функциите си с помощта на ENCRYPTION
аргумент.
Ето пример за криптиране на функцията:
СЪЗДАВАНЕ НА ФУНКЦИЯ dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) ВРЪЩА ТАБЛИЦА С ОБВЪЗВАНЕ НА СХЕМИ, ИЗБЕРЕТЕ CatId, CatName, Phone ОТ dbo.Cats WHERE CatName =GO);Сега не мога да видя дефиницията на функцията.
ИЗБЕРЕТЕ дефиниция ОТ sys.sql_modulesWHERE object_id =OBJECT_ID('udf_CatsByName_ITVF');Резултат:
+--------------+| определение ||--------------|| NULL |+--------------+Също така получавам съобщение за грешка, когато се опитвам да напиша дефиницията на функцията чрез Azure Data Studio:
Не беше върнат скрипт при скриптиране като Създаване на обект UserDefinedFunctionИмайте предвид, че текстът на криптирана функция все още е достъпен за привилегировани потребители, които могат да имат достъп до системните таблици през DAC порта или директно да имат достъп до файловете на базата данни. Освен това потребителите, които могат да прикачат дебъгер към сървърния процес, могат да извличат оригиналната процедура от паметта по време на изпълнение.