
Использование входных параметров
С технической точки зрения параметры являются временными переменными, поскольку они хранятся в памяти, а их содержимое может изменяться. Например, в предыдущей хранимой процедуре вместо статичного значения '1/1/2003' следовало использовать входной параметр. Тогда пользователи могли бы задавать дату по своему усмотрению. Чтобы продемонстрировать принцип действия входных параметров, мы модифицируем ранее созданную хранимую процедуру dbo.Show_Orders, чтобы она принимала параметры от пользователей (этим мы продемонстрируем не только принцип действия параметров, но и метод модификации существующей хранимой процедуры).
Откройте SQL Server Management Studio. В окне Object Explorer раскройте папки сервера Databases=> Sales=> Prograramability=> Stored Procedures.
Щелкните правой кнопкой на хранимой процедуре dbo.Show_Sales и выберите команду Modify. Откроется редактор запросов SQL Server с шаблоном запроса на изменение хранимой процедуры.
В секции Add the parameters for the stored procedure here вместо шаблона параметра введите имя (@Date), тип (Datatime) и значение по умолчанию (‘1/1/2000’).
Чтобы использовать новый параметр, модифицируйте запрос в секции Insert statements for procedure (рис.3):
SELECT ProdID, Qty, OrdDate
FROM dbo.Sales
WHERE OrdDate > @Date
ORDER BY OrdDate, ProdID
5. Чтобы сохранить изменения, щелкните на кнопке Save панели инструментов.
Итак, у нас имеется модифицированная хранимая процедура dbo.Show_ Orders, принимающая параметр пользователя. Осталось протестировать ее.
1. Чтобы протестировать процедуру, откройте новый запрос SQL Server и выполните следующий код:
USE Sales
EXEC dbo.Show_Sales '5/7/2008'
2. Теперь попробуйте ввести другую дату.
USE Sales
EXEC dbo.Show_Sales '5/13/2008'
Закройте окно запроса.
Рис.
3. Добавляем в хранимую процедуру
параметры
Подумайте хорошенько о том, что вы только что сделали. Вместо того, чтобы вынуждать пользователей извлекать данные лишь для 1 января 2003 года, вы предоставили им возможность делать это для любой даты. А потребовалось-то всего добавить в начало хранимой процедуры переменную @Date. В нашем случае переменной @Date сначала была присвоена дата 7 мая 2008 года, а затем 13 мая 2008 года. Если пользователь не введет дату, то на этот случай для входного параметра предусмотрено значение по умолчанию (1января 2000 года). Мы это сделали путем добавления оператора @Date datetime = '1/1/2000'.
Однако это далеко не все возможности хранимых процедур. Предположим, что пользователи не хотят видеть результат запроса, а лишь результат выполнения математических операций. Чтобы удовлетворить такие потребности, можно создать хранимую процедуру, использующую как входные, так и выходные параметры.
Использование выходных параметров
Выходной параметр противоположен входному. С помощью входного параметра вы задаете хранимой процедуре значение для работы; с помощью выходного параметра хранимая процедура возвращает значение, используемое в дальнейших запросах. Выходной параметр создается в том же месте, где и входной — между именем процедуры и ключевым словом AS. Единственное отличие состоит в том, что выходной параметр определяется с помощью ключевого слова OUTPUT. В следующем примере мы создадим простую хранимую процедуру калькулятора, чтобы увидеть возможности выходного параметра.
Откройте SQL Server Management Studio. В окне Object Explorer разверните папки сервера Databases=> Sales=> Programmability.
Щелкните правой кнопкой на папке Stored Procedures и выберите команду New Stored Procedure. Откроется редактор запросов SQL Server с шаблоном запроса на создание хранимой процедуры.
В предложении CREATE PROCEDURE введите имя процедуры: Calc.
В секции Add the parameters for the stored procedure here для создания первого входного параметра используйте следующие данные:
Parameter Name: @ first
Datatype: int
Value_Default:: 0
Для создания второго входного параметра используйте следующие данные:
Parameter Name: @sec
Datatype: int
Value_Default:: 0
Для создания выходного параметра используйте следующие данные:
Parameter Name: @ret
Datatype: int
Value_Default:: 0