Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Създайте вградена функция с таблица с стойност (ITVF) в SQL Server

Можете да създадете вградена функция с таблица с стойност (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 порта или директно да имат достъп до файловете на базата данни. Освен това потребителите, които могат да прикачат дебъгер към сървърния процес, могат да извличат оригиналната процедура от паметта по време на изпълнение.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да изключите записи с определени стойности в sql select

  2. как да намерите размера на редовете в таблицата

  3. Урок по SQL (DDL, DML) на примера на диалект на MS SQL Server

  4. Как да проверите дали SQL базата данни е повредена – Решение за поправка на MDF файл

  5. Как да архивирате база данни на SQL сървър с помощта на T-SQL