Правила написания пользовательских функций
Пользовательская функция хранится как объект базы данных, предоставляя повторно используемый код, который можно применять следующим образом.
- В инструкциях Transact-SQL, например SELECT.
- В приложениях, вызывающих функцию.
- В определении другой пользовательской функции.
- Для параметризации представления или улучшения функциональности индексированного представления.
- Для определения столбца таблицы.
- Для определения ограничения CHECK на столбец.
- Для замены хранимой процедуры.
Определяемые пользователем функции расширены в Microsoft SQL Server 2005 и могут включать функции, написаны на любом языке программирования, поддерживаемым платформой Microsoft .NET Framework. Кроме того, были отменены некоторые ограничения на использование недетерминированных функций. Эти изменения влияют на принятие решения о типе проектируемой для реализации пользовательской функции.
Выбор типа функции
При проектировании пользовательской функции сначала определите тип функции, который лучше всего соответствует задачам. Будет ли функция выполнять следующее.
- Возвращать скалярное значение (одно значение).
- Возвращать таблицу (несколько строк).
- Выполнять сложные вычисления.
- Использоваться в основном для доступа к данным SQL Server.
Определяемые пользователями функции, написанные на Transact-SQL или на платформе .NET Framework, могут возвращать и скалярные, и табличные значения.
Свойства функций
Определяемые пользователями функции имеют несколько свойств, определяющих способность ядра СУБД индексировать результаты функции как с помощью индексов вычисляемых столбцов, вызывающих функцию, так и с помощью индексированных представлений, которые на нее ссылаются. Эти свойства также относятся к методам определяемых пользователем типов данных CLR.
Детерминизм
Детерминированные функции каждый раз возвращают один и тот же результат, если предоставлять им один и тот же набор входных значений и использовать одно и то же состояние базы данных. Недетерминированные функции могут возвращать каждый раз разные результаты, даже если предоставлять им один и тот же набор входных значений и использовать одно и то же состояние базы данных.
Ядро СУБД автоматически анализирует текст функций Transact-SQL и определяет, является ли функция детерминированной. Например, если функция вызывает другие, недетерминированные, функции или если функция вызывает расширенные хранимые процедуры, ядро СУБД помечает ее как недетерминированную. Детерминизм функции CLR определяется ядром СУБД по данным, предоставленным автором функции, который помечает ее как детерминированную или нет с помощью пользовательского атрибута SqlFunction.
Точность
Пользовательская функция считается точной, если она не использует никаких операций над числами с плавающей запятой.
Ядро СУБД автоматически анализирует текст функций Transact-SQL и определяет, является ли функция точной. Точность функции CLR определяется ядром СУБД по данным, предоставленным автором функции, который помечает ее как точную или нет с помощью пользовательского атрибута SqlFunction.
Доступ к данным
Это свойство определяет, есть ли у функции доступ к локальному серверу баз данных с помощью внутрипроцессного управляемого поставщика SQL Server. Дополнительные сведения см. в разделе Data Access from CLR Database Objects.
Ядро СУБД автоматически анализирует текст функций Transact-SQL и определяет, выполняет ли функция доступ к данным. Свойства доступа к данным функции CLR определяются ядром СУБД по данным, предоставленным автором функции, который определяет свойства доступа к данным с помощью пользовательского атрибута SqlFunction. Это свойство применяется ядром СУБД принудительно во время выполнения. Если параметр функции DataAccess имеет значение «None», но использует доступ к данным, выполнение функции будет прервано.
Доступ к системным данным
Это свойство определяет, есть ли у функции доступ к системным метаданным на локальном сервере баз данных с помощью внутрипроцессного управляемого поставщика SQL Server.
Ядро СУБД автоматически анализирует текст функций Transact-SQL и определяет, выполняет ли функция доступ к данным. Свойства доступа к системным данным функции CLR определяются ядром СУБД по данным, предоставленным автором функции, который определяет свойства доступа к системным данным с помощью пользовательского атрибута SqlFunction. Это свойство принудительно применяется ядром СУБД во время выполнения. Если параметр функции SystemDataAccess имеет значение «None», но использует доступ к системным данным, выполнение функции будет прервано.
Свойство IsSystemVerified
Это свойство определяет, может ли ядро СУБД проверить детерминизм и точность функции. Оно принимает значение True для функций языка Transact-SQL, если они не вызывают функции, у которых параметр IsSystemVerified принимает значение False. Это свойство принимает значение False для функций CLR.
Ядро СУБД автоматически определяет значение свойства IsSystemVerified для функций. Если функции Transact-SQL обращаются к какой-либо функции со значением False параметра IsSystemVerified, у самих этих функций параметр IsSystemVerified также принимает это значение.
Дополнительные сведения о функциях и индексируемых вычисляемых столбцах и индексируемых представлениях см. в разделах Создание индексов вычисляемых столбцов и Создание индексированных представлений.
См. также
Основные понятия
Возвращающие табличное значение пользовательские функции
Определяемые пользователем встроенные функции
Детерминированные и недетерминированные функции
Преобразование хранимых процедур в функции