Хранимые процедуры
Хранимые процедуры SQL Server
2005 подобны процедурам, написанным на других языках программирования. Они
могут:
П
содержать различные программные конструкции, в том числе команды управления
данными;
·
вызываться как из
удаленного клиентского приложения, так и из других хранимых процедур и других
программных объектов;
·
принимать входные
параметры и возвращать данные через эти параметры;
· возвращать данные через табличные наборы данных;
·
возвращать в
вызывающий модуль статус выполнения процедуры. Существует четыре вида хранимых
процедур:
· хранимые процедуры, написанные на языке Transact-SQL;
·
расширенные
хранимые процедуры, имеющие структуру обычных динамических библиотек
операционной системы Windows.
Расширенные хранимые процедуры считаются устаревшим средством и в новых
версиях будут удалены из SQL Server;
·
хранимые процедуры на языках .NET (CLR Stored procedure, CLR — common language
runtime);
·
системные
хранимые процедуры, а также расширенные системные процедуры. Осуществляют в
основном административные действия и поддерживают интерфейс с внешними по
отношению к SQL Server программами.
Пользовательские
функции
Как и хранимые процедуры, пользовательские
функции являются программными модулями, которые принимают параметры, выполняют
некоторые действия, в том числе над данными, и возвращающие результат
действия. SQL Server 2005 поддерживает следующие виды функций.
·
Скалярные
функции. Функция может состоять из большого числа операторов, но возвращает
одно скалярное (не табличное) значение.
·
Табличные функции
с одним запросом (inline-функции). Содержат всего
один запрос select, результат выполнения
которого и возвращают.
·
Многооператорные табличные функции (функции multi-statement).
Могут содержать большое количество операторов, возвращают табличный набор
данных (таблицу).
·
Встроенные
функции. Существует большое количество встроенных функций, начиная от
системных и заканчивая математическими. В главе 3 мы
дадим их полный перечень.
Представления
Я отношу представления к программным
объектам базы данных, хотя представления обладают явными чертами таблиц (подробнее
см. разд. 3.3). Другое название представления— виртуальная
таблица. Представление является всего лишь запросом select, который хранится в базе как самостоятельный объект и
ведет себя по отношению к другим запросам как обыкновенная таблица.
Представление похоже на таблицу также и тем, что для него можно создавать
индексы и триггеры. Однако содержимое представления не хранится в виде
столбцов и строк, а формируется динамически во время обращения к нему.
Представление служит своеобразным фильтром между базой данных и пользователем,
для которого представление ничем не отличается от обычной таблицы.
Одновременно представление можно назвать некоторым интерфейсом, поскольку с
помощью него можно получить доступ не только к нескольким таблицам одной базы
данных, но и таблицам нескольких баз данных.
Пользовательские
функции
Функции, построенные на технологии .NET, будут разбираться нами в главе 4. На языке Transact-SQL могут быть
созданы пользовательские функции трех видов:
·
функция типа scalar — возвращает скалярное значение;
·
функция типа inline — возвращает табличное значение и состоит всего из
одной команды select;
·
функция типа multi-statement —
возвращает табличное выражение и может состоять из
множества команд и операторов Transact-SQL.
Если формат команд создания и изменения
разных типов функций может несколько отличаться друг от друга, то удаляются
все функции одной командой:
drop function <имя_функции>
Функции отличаются от хранимых процедур по
следующим позициям.
·
Если в теле
процедуры (или триггера) при выполнении команды Transact-SQL произойдет
ошибка, то текущая команда прерывается, и будет выполняться следующая команда.
В случае пользовательской функции аналогичная ошибка приведет к прерыванию
выполнения функции, что в свою очередь прервет работу и той команды, которая
вызвала данную функцию.
· В теле запрещены какие-либо изменения глобальных по отношению к функции объектов, например таблиц, курсоров и т.д. Данное свойство функций объяснить достаточно просто. Функции используются в командах SQL и включаются в план запроса. Команды, вызывающие изменения в глобальных объектах, вызвали бы необходимость перекомпиляции запросов после каждого вызова функции. Не забывайте еще и о том, что если функция стоит, например, в разделе where, то она может вызываться при выполнении запроса несколько раз.