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

Създайте UDF, обвързан със схема в SQL Server

В SQL Server обикновено е добра идея да обвържете по схема вашите дефинирани от потребителя функции (UDF).

Обвързващата схема на вашия UDF ще гарантира, че основните таблици не могат да бъдат променени по начин, който би повлиял на вашата функция. Без обвързване на схемата, основните таблици или други обекти могат да бъдат модифицирани или дори изтрити. Правейки това може да наруши функцията.

За да създадете UDF, обвързан със схема, използвайте WITH SCHEMABINDING във вашия T-SQL код за създаване на функцията. Това важи независимо дали функцията е скаларна функция или функция с таблична стойност (TVF).

Във всеки случай, включих примери за вграден TVF, TVF с множество оператори и скаларна функция.

Пример 1 – Вградена функция с таблично стойност

Ето пример за създаване на вграден TVF с обвързване на схема:

СЪЗДАВАНЕ НА ФУНКЦИЯ 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' е невалидно за свързване на схема. Имената трябва да са във формат от две части и обектът не може да се позовава на себе си.

Пример 2 – Функция с таблична стойност с множество изрази

При TVF с множество оператори поставяте WITH SCHEMABINDING след спецификацията на връщащата променлива.

СЪЗДАВАНЕ НА ФУНКЦИЯ dbo.udf_PetsByName_MSTVF( @PetName varchar(70)) ВРЪЩА @pets ТАБЛИЦА ( PetId varchar(20), PetName varchar(70) ) СЪС SCHEMABINDINGASBEGIN INSERT INTO @pets SELECT' CONCAT('d'Cat ), CatName FROM dbo.Cats WHERE CatName =@PetName; INSERT INTO @pets SELECT CONCAT('Dog', ' ', DogId), DogName FROM dbo.Dogs WHERE DogName =@PetName; АКО @@ROWCOUNT =0 ЗАПОЧНЕТЕ ВМЕСТЕ В СТОЙНОСТИТЕ @pets ( '', 'Няма домашни любимци с това име' ) END RETURN;END;GO

Пример 3 – Скаларна функция

Ето пример за скаларна функция:

СЪЗДАВАНЕ НА ФУНКЦИЯ dbo.ufn_CountAlbums (@ArtistId int) ВРЪЩА smallintWITH SCHEMABINDINGAS BEGIN DECLARE @AlbumCount int; ИЗБЕРЕТЕ @AlbumCount =COUNT(AlbumId) ОТ dbo.Albums WHERE ArtistId =@ArtistId; ВЪРНЕТЕ @AlbumCount;END;GO

Пример 4 – Добавяне на множество аргументи

Можете да посочите множество аргументи като разделен със запетая списък. Например, ако искате да посочите свързване на схема и криптиране, тогава ще трябва да ги добавите като списък, разделен със запетая.

СЪЗДАВАНЕ НА ФУНКЦИЯ dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) ВРЪЩА ТАБЛИЦА С ОБВЪЗВАНЕ НА СХЕМИ, ВЪЗРАЩАНЕ НА ШИФРИРАНЕ ( ИЗБЕРЕТЕ CatId, CatName, Phone ОТ dbo.Cats WHERE CatName =GO); 
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да извлека записи за последните 30 минути в MS SQL?

  2. Може ли външният ключ да бъде NULL и/или дублиран?

  3. Генериране на SQL Създаване на скриптове за съществуващи таблици с Query

  4. Не е равно <> !=оператор на NULL

  5. Буферен кеш:Какво е това и как влияе върху производителността на базата данни?