Детерминизм функций

Функции могут быть детерминированными и недетерминированными. Функция является детерминированной, если она всегда возвращает одно и то же значение для одних и тех же значений входных аргументов.

Например, встроенная функция DATEADD является детерминированной, поскольку она всегда возвращает один и тот же результат для любого данного набора значений трех своих параметров.

Функция GETDATE не является детерминированной, поскольку она всегда вызывается с одним и тем же аргументом, но возвращает все время разные значения при каждом выполнении.

Типы функций

SQL Server 2000 поддерживает три типа UDF:

  • Скалярнозначные функции
  • Однострочные (inline) табличнозначные функции
  • Многооператорные табличнозначные фунции

Скалярнозначные функции

Пользовательская скалярная функция возвращает в качестве ответа единственное значение при каждом вызове функции. Функции являются скалярнозначными, если предложение возвращающее значение – RETURNS определяет один из скалярных типов данных. Скалярнозначные функции могут быть определены с помощью нескольких операторов Transact-SQL. Например:

CREATE FUNCTION CubicVolume
(@CubeLength decimal (4,1), @CubeWidth decimal (4,1), @CubeHeight decimal (4,1))
RETURNS decimal (12,3) -- тип данных возвращаемого значения.
AS
BEGIN
RETURN (@CubeLength * @CubeWidth * @CubeHeight)
END

В данном примере предложение RETURNS определяет, что функция будет возвращать скалярное значение типа decimal. Предложение RETURNS может использовать любой из скалярных типов данных, которые поддерживает SQL Server, за исключением timestamp, text, ntext или image.

Для скалярнозначных функций необходимо использовать оператор RETURN с аргументом. Значение аргумента является возвращаемым значением функции. Тип данных аргумента будет неявно преобразован к типу возвращаемого значения функции.

Вызывать скалярнозначную функцию можно либо при помощи двойного имени в форме ИмяВладельца.ИмяФункции или тройного имени в форме ИмяБД. ИмяВладельца.ИмяФункции.

Нельзя вызывать скалярнозначную функцию при помощи простого (неуточненного) имени, чтобы отличать вызовы системных функций и UDF. Приведенную выше функцию можно вызвать следующим образом:

Select dbo.CubicVolume(12.2,10.6,10.0) или

Print dbo.CubicVolume(12.2,10.6,10.0)


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: