Основы языка Transact-SQL. Переменные. Встроенные функции. Скалярные функции, страница 4

CREATE FUNCTION [имя_схемы.] имя_функции ( [ { @имя_параметра [AS] [имя_схемы.] тип_данных_параметра [ = значение_параметра_по_умолчанию] } [, …n] ] ) RETURNS тип_возвращаемых_данных [ WITH <function_option> [, …n] ] [ AS ] BEGIN тело_функции RETURN скалярное_выражение END [ ; ]

51

<function_option>::= { [ENCRYPTION] | [SCHEMABINDING] | [EXECUTE_AS_Clause] }

52

Назначение элементов синтаксиса: [имя_схемы.] имя_функции - имя функции, (соответствует правилам для идентификаторов). Дополнительно в необязательном параметре [имя_схемы.] можно указать и имя владельца функции - имя пользователя или роли, из имеющихся в БД. Если имя владельца опущено, то функция будет принадлежать пользователю, выполняющему создание функции. Имя функции должно быть уникальным среди различных объектов БД, принадлежащих владельцу функции.

53

В параметре [имя_схемы.] не допускается указание имени БД или сервера. Таким образом, пользовательская функция может быть создана только в текущей БД. Если необходимо создать функцию в другой БД, то сначала нужно установить эту БД в качестве текущей с помощью команды USE имя_БД

54

@имя_параметра – имя входного параметра (начинается с символа @), должно быть уникальным в пределах создаваемой функции. тип_данных_параметра – допускается использование любого из поддерживаемых SQL Server типов данных (включая пользовательские), кроме типов данных timestamp, cursor, table. [= значение_параметра_по_умолчанию] – значение, автоматически присваиваемое входному параметру, если пользователь явно не указал значение параметра при вызове функции.

55

[, …n] – указывает на возможность задания многих параметров функции, используя синтаксис, аналогичный описанному. RETURNS тип_возвращаемых_данных – указывается, какой тип данных будет иметь значение, возвращаемое функцией. Скалярные функции могут возвращать значения любых типов данных, за исключением типов данных timestamp, cursor, table, text, ntext, image.

56

  • [ WITH <function_option> [, …n] ]
  • - с помощью ключевого слова WITH указываются дополнительные параметры создания функции.
  • Синтаксис и значения параметров:
  • <function_option>::=
  • { [ENCRYPTION] | [SCHEMABINDING] | [EXECUTE_AS_Clause] }
  • ENCRYPTION - задает шифрование определения функции при его сохранении;
  • SCHEMABINDING - запрещает удаление любых объектов, от которых зависит функция;
  • EXECUTE_AS - определяет контекст безопасности функции.

57

[AS] – после этого необязательного ключевого слова следует определение тела функции. BEGIN…END – блок, внутри которого находится тело_функции, включающее основные операторы функции. В теле функции выполняется различный код, обращение к другим объектам БД. Ограничение - нельзя изменить с помощью функции состояние любого объекта в БД или самой БД (невозможны вставка, обновление, удаление данных в таблицах; создание, изменение, удаление объектов в БД). Для обработки данных таблиц используются табличные переменные и функции.

58

RETURN скалярное_выражение - когда в ходе выполнения кода функции встречается ключевое слово RETURN, выполнение функции завершается, и как результат вычисления функции возвращается значение, указанное сразу после ключевого слова RETURN.

59

Пример 1. Рассмотрим создание функции с именем FunctionA и тремя входными параметрами: 1-й и 2-й - с типом данных bigint, 3-й - с типом данных char(1) и значением по умолчанию *. Функция возвращает значение с типом данных bigint и выполняет арифметические операции: сложение, вычитание, умножение, деление двух целых чисел, подаваемых на вход функции. Выполняемая операция задается 3-м параметром функции, принимающим значения: +, -, *, / .

60

61

Переменная @Var3 нужна, чтобы возвращать значение функции.

Примеры использования данной функции:

(при использовании нецелых исходных данных происходит округление).

62

Пример 2. Функция Goods для вычисления суммарного количества товара определенного типа. Имя владельца функции - user1.

CREATE FUNCTION user1.Goods(@type char(15)) RETURNS INT AS BEGIN DECLARE @c INT SET @c=(SELECT SUM(Количество) FROM Товары WHERE Тип_товара=@type) RETURN (@c) END

63