Отправляет email-рассылки с помощью сервиса Sendsay

Вопросы и ответы по MS SQL Server

  Все выпуски  

Вопросы и ответы по MS SQL Server


Информационный Канал Subscribe.Ru


Вопросы и ответы по MS SQL Server

Выпуск No. 13 от 2003-05-16

Вопрос : Чем пользовательские функции (UDF) отличаются от хранимых процедур?

Ответ:
В MS SQL Server 2000 появилась возможность создания своих функций, которые так и называются "определяемые пользователем функции" или User-Defined Functions (UDF).

Узнав о том, что теперь можно самому писать функции, сразу же думаешь: "Вау!!! Сейчас я накодирую такие штуки, о которых давно мечтал". И опять реальность оказывается суровой. После кропотливого изучения возможностей пользовательских функций остается смешанное чувство радости с неудовлетворенностью, потому что с помощью функций можно упростить и улучшить свой код, но при этом постоянно сталкиваешься с наложенными на них ограничениями.

Итак, что же такого могут делать пользовательские функции, чего не могут хранимые процедуры:
1. Пользовательская функция может возвращать скалярную величину так, как это делают системные функции.
CREATE FUNCTION MySquare

(@i int)
RETURNS int
AS
BEGIN
RETURN (@i*@i)
END
GO
SELECT TOP 3 dbo.MySquare(ID) AS ColumnA

FROM sysobjects
GO
DROP FUNCTION MySquare

GO

Результат:
ColumnA

-----------
1
4
9

(3 row(s) affected)

2. Пользовательская функция может возвращать набор данных, который можно использовать как обычную таблицу.
CREATE FUNCTION ListObj (@xtype char(2))

RETURNS TABLE
AS
RETURN (
SELECT *
FROM sysobjects
WHERE xtype = @xtype
)
GO
SELECT a.Name, b.Name AS ParentName
FROM ListObj('PK') a
JOIN ListObj('U') b ON b.id=a.parent_obj
GO
DROP FUNCTION ListObj

GO

3. Пользовательские функции можно включать в операторы SQL, вычисляемые столбцы, ограничения CHECK и значения по умолчанию.

Если в процессе выполнения процедуры происходит ошибка, то выполнение процедуры продолжается. А возникновение ошибки в процессе работы функции прекращает дальнейшее выполнение этой функции и оператора, ее вызвавшего.

Как было сказано ранее, у пользовательских функций есть масса ограничений, которые мешают вздохнуть полной грудью. Вместо перечисления ограничений проще перечислить, что разрешается использовать в теле функций:
1. Оператор DECLARE для определения переменных и локальных курсоров.
2. Операторы присваивания, такие как SET, для присвоения значений переменным.
3. Операторы для работы с локальными курсорами. При этом оператор FETCH можно использовать только с выражением INTO.
4. Операторы ветвления (такие как IF..ELSE, WHILE, RETURN, GOTO, BREAK и CONTINUE).
5. Оператор SELECT с присвоением значений переменным.
6. Операторы UPDATE, INSERT и DELETE для работы с переменными табличного типа.
7. Оператор EXECUTE для вызова расширенных хранимых процедур.
8. Детерминированные функции, т.е. такие функции, которые ограничены рядом условий.

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

И еще есть ряд ограничений:
1. У функций нет output параметров. Можно возвращать только один параметр.
2. Количество и порядок передаваемых в функцию параметров постоянен. Вместо пропуска параметра, как это делается в хранимых процедурах, необходимо передавать значение, используя ключевое слово DEFAULT.
3. При вызове функций, возвращающих скалярные величины необходимо указывать владельца функции (как правило dbo).

Некоторые ограничения можно обойти. Например, запрет использования недетерминированной функции GETDATE() можно обойти с помощью использования представления (VIEW), возвращающего значение GETDATE(). Еще один способ обхода запретов можно посмотреть в рассылке номер 8.
Надеюсь, Вы нашли эту информацию полезной. Вопросы, предложения и пожелания шлите на адрес sql@likor.ru
С уважением, Сергей Кошкин.
Архив рассылки смотрите на сайте Рассылки http://sql.softmatics.ru/
Рейтинг@Mail.ru

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное