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

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

  • В инструкциях Transact-SQL, например SELECT.

  • В приложениях, вызывающих функцию.

  • В определении другой определяемой пользователем функции.

  • Для параметризации представления или улучшения функциональности индексированного представления.

  • Для определения столбца таблицы.

  • Для определения ограничения CHECK на столбец.

  • Для замены хранимой процедуры.

Выбор типа функции

При проектировании определяемых пользователем функции сначала определите тип функции, который лучше всего соответствует вашим задачам. Будет ли функция выполнять следующее.

  • Возвращать скалярное значение (одно значение).

  • Возвращать таблицу (несколько строк).

  • Выполнять сложные вычисления.

  • Использоваться в основном для доступа к данным SQL Server.

Определяемые пользователями функции, написанные на Transact-SQL или на платформе .NET Framework, могут возвращать и скалярные, и табличные значения.

Свойства функций

Определяемые пользователями функции имеют несколько свойств, определяющих способность компонента SQL Server Database Engine индексировать результаты функции как с помощью индексов вычисляемых столбцов, вызывающих функцию, так и с помощью индексированных представлений, которые на нее ссылаются. Эти свойства также относятся к методам определяемых пользователем типов данных CLR.

Детерминизм

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

Компонент SQL Server Database Engine автоматически анализирует текст функций Transact-SQL и определяет, является ли функция детерминированной. Например, если функция вызывает другие, недетерминированные, функции или если функция вызывает расширенные хранимые процедуры, компонент SQL Server Database Engine помечает ее как недетерминированную. Детерминизм функции CLR определяется компонентом SQL Server Database Engine по данным, предоставленным автором функции, который помечает ее как детерминированную или недетерминированную с помощью пользовательского атрибута SqlFunction.

Точность

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

Компонент Database Engine автоматически анализирует текст функций Transact-SQL и определяет, является ли функция точной. Точность функции CLR определяется компонентом Database Engine по данным, предоставленным автором функции, который помечает ее как точную или нет с помощью пользовательского атрибута SqlFunction.

Доступ к данным

Это свойство определяет, обращается ли функция к локальному серверу баз данных с помощью внутрипроцессного управляемого поставщика SQL Server. Дополнительные сведения см. в разделе Доступ к данным из объектов среды CLR для работы с базами данных.

Компонент Database Engine автоматически анализирует текст функций Transact-SQL и определяет, выполняет ли функция доступ к данным. Свойства доступа к данным функции CLR определяются компонентом Database Engine по данным, предоставленным автором функции, который определяет свойства доступа к данным с помощью пользовательского атрибута SqlFunction. Это свойство применяется компонентом Database Engine принудительно во время выполнения. Если параметр функции DataAccess имеет значение «None», но использует доступ к данным, выполнение функции будет прервано.

Доступ к системным данным

Это свойство определяет, есть ли у функции доступ к системным метаданным на локальном сервере баз данных с помощью внутрипроцессного управляемого поставщика SQL Server.

Компонент Database Engine автоматически анализирует текст функций Transact-SQL и определяет, выполняет ли функция доступ к данным. Свойства доступа к системным данным функции CLR определяются компонентом Database Engine по данным, предоставленным автором функции, который определяет свойства доступа к системным данным с помощью пользовательского атрибута SqlFunction. Это свойство принудительно применяется компонентом Database Engine во время выполнения. Если параметр функции SystemDataAccess имеет значение «None», но использует доступ к системным данным, выполнение функции будет прервано.

Свойство IsSystemVerified

Это свойство определяет, может ли компонент Database Engine проверить детерминизм и точность функции. Оно принимает значение True для функций языка Transact-SQL, если они не вызывают функции, у которых параметр IsSystemVerified принимает значение False. Это свойство принимает значение False для функций CLR.

Компонент Database Engine автоматически определяет значение свойства IsSystemVerified для функций. Если функции Transact-SQL обращаются к какой-либо функции со значением False параметра IsSystemVerified, у самих этих функций параметр IsSystemVerified также принимает это значение.

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