Создание пользовательских функций (Database Engine)
Пользовательские функции создаются инструкцией CREATE FUNCTION, изменяются инструкцией ALTER FUNCTION и удаляются инструкцией DROP FUNCTION. Полное имя каждой пользовательской функции (schema_name.function_name) должно быть уникальным.
Требования
Ошибки языка Transact-SQL, вызывающие отмену инструкции и продолжение выполнения со следующей инструкции модуля (триггера или хранимой процедуры), внутри функций обрабатываются иным образом. В функциях такие ошибки вызывают остановку выполнения функции. Это вызывает отмену инструкции, вызвавшей функцию.
Инструкции в блоке BEGIN...END не могут иметь каких-либо побочных эффектов. Побочными эффектами функций называются любые постоянные изменения состояния ресурса, область которого лежит за пределами функции, например изменение таблицы базы данных. Инструкции внутри функции могут изменять только локальные по отношению к этой функции объекты, например локальные курсоры или переменные. Изменения таблиц баз данных, операции с курсорами, не являющимися локальными для данной функции, отправка электронной почты, попытка изменения каталога, формирование результирующего набора, возвращаемого пользователю — это примеры действий, выполнение которых внутри функции невозможно.
Число раз, когда указанная в запросе функция будет фактически выполнена, может различаться для разных планов выполнения, построенных оптимизатором. Примером является функция, вызываемая вложенным запросом в предложении WHERE. Число раз, когда вложенный запрос и его функция будут выполнены, может различаться для разных путей доступа, выбираемых оптимизатором.
Инструкции, допустимые в функциях
К типам инструкций, допустимым внутри функций, относятся следующие.
- Инструкции DECLARE, используемые для определения переменных и курсоров, локальных для данной функции.
- Присвоение значений объектам, локальным для данной функции, например присвоение значений скалярным и табличным локальным переменным с помощью инструкции SET.
- Операции над курсорами, обращающиеся к локальным курсорам и выполняющие их объявление, открытие, закрытие и освобождение внутри функции. Инструкции FETCH, возвращающие данные клиенту, запрещены. Разрешены только инструкции FETCH, присваивающие значения локальным переменным с помощью предложения INTO.
- Инструкции управления потоком, за исключением инструкций TRY...CATCH.
- Инструкции SELECT, содержащие списки выборки с выражениями, присваивающими значения переменным, локальным для данной функции.
- Инструкции UPDATE, INSERT и DELETE, изменяющие табличные переменные, локальные для функции.
- Инструкции EXECUTE, вызывающие расширенную хранимую процедуру.
Встроенные системные функции
В SQL Server 2005 можно использовать следующие недетерминистические встроенные функции в пользовательских функциях языка Transact-SQL.
CURRENT_TIMESTAMP |
@@MAX_CONNECTIONS |
GET_TRANSMISSION_STATUS |
@@PACK_RECEIVED |
GETDATE |
@@PACK_SENT |
GETUTCDATE |
@@PACKET_ERRORS |
@@CONNECTIONS |
@@TIMETICKS |
@@CPU_BUSY |
@@TOTAL_ERRORS |
@@DBTS |
@@TOTAL_READ |
@@IDLE |
@@TOTAL_WRITE |
@@IO_BUSY |
|
Следующие недетерминистические встроенные функции в пользовательских функциях языка Transact-SQL использовать нельзя.
NEWID |
RAND |
NEWSEQUENTIALID |
TEXTPTR |
Список детерминистических и недетерминистических встроенных системных функций см. в разделе Детерминированные и недетерминированные функции.
Функции, привязанные к схеме
Инструкция CREATE FUNCTION поддерживает предложение SCHEMABINDING, позволяющее привязать функцию к схеме каких-либо объектов, на которые она ссылается, например таблиц, представлений и других пользовательских функций. Попытка изменения или удаления любого объекта, к которому обращается привязанная к схеме функция, приводит к ошибке.
Перед указанием предложения SCHEMABINDING в инструкции CREATE FUNCTION нужно соблюсти следующие условия.
- Все представления и пользовательские функции, к которым обращается функция, должны быть привязаны к схеме.
- Все объекты, к которым обращается функция, должны находиться в той же базе данных, что и функция. Обращение к объектам должно производиться по однокомпонентным либо двухкомпонентным именам.
- Для всех объектов (таблиц, представлений и пользовательских функций), к которым обращается функция, должно быть получено разрешение REFERENCES.
Для удаления привязки к схеме можно использовать инструкцию ALTER FUNCTION. В инструкции ALTER FUNCTION следует переопределить функцию без указания предложения WITH SCHEMABINDING.
Указание параметров
Пользовательская функция может принимать 0 или более входных параметров и возвращать либо скалярное, либо табличное значение. Максимальное число входных параметров для функции равно 1024. Если для параметра функции установлено значение по умолчанию, необходимо указать ключевое слово DEFAULT при вызове функции, чтобы получить установленное по умолчанию значение. Это поведение отличается от использования параметров со значениями по умолчанию в пользовательских хранимых процедурах, в которых пропущенный параметр также принимает значение по умолчанию. В пользовательских функциях не поддерживаются выходные параметры.
См. также
Основные понятия
Создание функций CLR
Создание пользовательских статистических выражений
Выполнение пользовательских функций (компонент Database Engine)
Просмотр пользовательских функций
Другие ресурсы
CREATE FUNCTION (Transact-SQL)