
Задание 8
Использование хранимых процедур
Содержание работы.
Создание хранимой процедуры без параметров, которая возвращает простой набор данных. Эта процедура в работе будет использоваться как базовая.
Использование входных параметров.
Использование выходных параметров.
Создание (самостоятельно) хранимой процедуры для БД Sales с входными параметрами, подсчитывающую количество товаров во всех заказах, сделанных таким-то покупателем за такой-то период. Предварительно добавьте (если нужно) в БД три записи, две из которых относятся к заказам, сделанным указанным во входном параметре покупателем в указанный период времени. Протестируйте созданную процедуру.
Описание работы
Хранимая процедура - это инструмент, изначально предназначенный для оптимизации процесса извлечения данных.
Понятие хранимой процедуры
Хранимая процедура представляет собой запрос, хранящийся в базе данных SQL Server, а не в интерфейсном коде на клиентской машине. Зачем хранить запросы в базе данных на сервере? Причины здесь три:
производительность,
компилирование,
управление.
Как хранимые процедуры повышают производительность? Рассмотрим следующий запрос, который выводит все заказы из таблицы dbo.Orders базы данных Sales, сделанные на даты, начиная с 1 января 2008 года:
USE Sales
SELECT ProdID, Qty, OrdDate
FROM dbo.Sales
WHERE OrdDate > '1/1/2003'
ORDER BY OrdDate, ProdID
Хотя этот запрос небольшой (всего пять строк текста), представьте, что будет, сети 5000 пользователей в сети будут весь день выполнять его, пересылая со своих машин на сервер через сеть.
Чтобы не допускать перегрузок и поддерживать максимальную скорость работы сети, нужно уменьшить объем кода, пересылаемого с клиентских машин на сервер через сеть, и, таким образом, уменьшить трафик, генерируемый в сети. Для этого нужно всего лишь сохранить код на сервере, а не на клиентских машинах, поместив запрос в хранимую процедуру. После создания хранимой процедуры пользователям потребуется пересылать по сети всего лишь следующий код:
EXEC имя_хранимой_процедуры
Еще одно преимущество хранимых процедур касается компилирования запросов. Когда программа SQL Server компилирует запрос, она считывает его, выискивает такие выражения, как JOIN и WHERE, и определяет, при использовании какого доступного индекса (если таковой есть) данные будут возвращаться быстрее всего. После определения самых быстрых индексов SQL Server создает план выполнения (представляющий собой набор инструкций запуска запроса) и сохраняет его в памяти. Нерегламентированные запросы практически всегда должны компилироваться при запуске, а хранимые процедуры — лишь раз, предварительно. Это означает, что хранимые процедуры практически всегда уже имеют свой план выполнения в памяти. Соответственно, они выполняются быстрее нерегламентированных запросов.
Есть еще одно преимущество хранимых процедур, касающееся управления базой данных. Например, если вам нужно модифицировать существующий запрос, который хранится на пользовательских компьютерах, все эти изменения следует выполнять на всех машинах пользователей. Если вы храните запрос на сервере как хранимую процедуру, то изменения нужно сделать лишь один раз — на сервере. Это может существенно сэкономить время и усилия.
Если запрос запускается редко (нерегламентированный запрос), нет реальной необходимости создавать хранимую процедура на сервере. Если же пользователи запускают некоторый запрос регулярно, то имеет смысл создать для него хранимую процедуру.
Самая простая хранимая процедура возвращает результаты, не требуя никаких параметров. В этом плане она похожа на запрос.
Данная хранимая процедура будет предназначена для извлечения информации обо всех заказах из таблицы dbo.Orders базы данных Sales, сделанные на даты, начиная с 1 января 2008 года.
Откройте SQL Server Management Studio. В окне Object Explorer разверните папки сервера Databases=> Sales=> Programmability.
Щелкните правой кнопкой на папке Stored Procedures и выберите команду New Stored Procedure. Откроется редактор запросов SQL Server с шаблоном запроса на создание хранимой процедуры.
В предложении CREATE PROCEDURE введите имя процедуры: Show_Orders.
В секции Add the parameters for the stored procedure here закомментируйте (или удалите) шаблоны параметров.
В секции Insert statements for procedure here измените код, чтобы он выглядел следующим образом (рис.1).
SELECT ProdID, Qty, OrdDate
FROM dbo.Sales
WHERE OrdDate > '1/1/2003'
ORDER BY OrdDate, ProdID
Рис.1. Создание хранимой процедуры
Чтобы сохранить процедуру, щелкните на кнопке Save панели инструментов и в раскрывшемся окне введите имя процедуры: Show_Orders.
Чтобы протестировать новую процедуру, откройте новый запрос SQL Server и выполните следующий код (рис.2).
USE Sales
EXEC dbo.Show_Orders
Закройте окно запроса.
Рис.2. Результат выполнения хранимой процедуры
Теперь для получения информации пользователи будут пересылать по сети всего лишь одну строку кода (EXEC Show_Orders) вместо пяти. как было перед созданием процедуры.
Единственная проблема, связанная с хранимыми процедурами, состоит в статичности всех значений. Если пользователям потребуются данные о продажах с 1 января 1998 года, то эта процедура им не поможет — им придется создавать нерегламентированный запрос.