Создание и управление индексами. Создание и управление встроенными процедурами. Оптимизация производительности запросов. Управление транзакциями и блокировками, страница 16

AS

SELECT TOP 5 ProductName, UnitPrice FROM Products ORDER BY UnitPrice desc

GO

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO

9.4 Использование параметров в процедурах

Параметры – расширенная возможность процедур. Вы можете с помощью параметров передавать в процедуру значения и получать обратно. Они позволяют вам использовать процедуру для поиска в базе данных множество раз. Например, вам может понадобится поиск счетов на определённую дату, и при этом дату можно передавать в процедуру в качестве параметра.

Использования входных параметров

Входные параметры передавать информацию в процедуру. Для объявления процедуры, которая получает входные параметры, вы объявляете одну или более переменных как параметры в операторе CREATE PROCEDURE.

Примите к сведению следующие факты и рекомендации при указании параметров:

*  Все входные параметры должны быть вначале процедуры, чтобы заранее ловить неправильные или отсутствующие параметры.

*  Вы должны предоставлять значения по умолчанию для параметров. Если значение по умолчанию указано, то пользователь может вызывать процедуру, не указывая параметров. Параметр должен быть константой или нулевым значением. Если вы указываете нулевое значение, то нужно использовать Null. Конструкция IS NULL не поддерживается, потому что синтаксис ANSI NULL не поддерживается.

*  Максимальное количество параметров – 1024.

*  Максимальное количество локальных переменных ограничено только доступной памятью.

*  Параметры локальны для процедуры. Одинаковые имена параметров могут использоваться в разных процедурах.

Информация о параметрах хранится в системной таблице syscolumns.

Пример

Следующий пример создаёт процедуру, которая возвращает все продажи в указанный период:

CREATE PROCEDURE dbo.[Year to Year Sales]

@BeginningDate DateTime, @EndingDate DateTime

AS

IF @BeginningDate IS NULL OR @EndingDate IS NULL

BEGIN

RAISERROR('NULL value not allowed', 14, 1)

RETURN

END

SELECT o.ShippedDate, o.OrderID, OS.Subtotal,

DATENAME(yy, ShippedDate) AS Year

FROM Orders o INNER JOIN [Order Subtotal] os

ON o.OrderID=os.OrderID

WHERE o.ShippedDate BETWEEN @BeginningDate AND @EndingDate

GO

Вызов процедур с параметрами

Для вызова процедуры вы должны после имени процедуры перечислить все передаваемые параметры. Например, процедура, созданная в предыдущем примере может быть вызвана следующим образом:

EXEC dbo.[Year to Year Sales]

@BeginningDate='10/10/2000',

@EndingDate='10/11/2002'

Можно вызывать процедуру без указания имени переменной, но при этом нужно перечислять параметры по мере их перечисления в объявлении процедуры:

EXEC dbo.[Year to Year Sales]

'10/10/2000', '10/11/2002'

Возврат значений, используя параметры

Процедуры могут возвращать информацию вызывающей процедуре или клиенту через выходные параметры (переменные, объявленные с ключевым словом OUTPUT). С помощью выходных параметров, любые изменения являются результатом выполнения процедуры и он может быть получен после завершения выполнения процедуры.

Для использования выходного параметра, вы должны указать ключевое слово OUTPUT  при создании процедуры в CREATE PROCEDURE и при выполнении в операторе EXECUTE. Если это слово опущено во время выполнения процедуры, процедура будет выполнена, но не вернёт значения. Выходной параметр имеет следующие характеристики:

*  Вызывающий оператор должен содержать имя переменной для получения результирующего значения. Невозможно передавать константы.

*  Вы можете использовать переменные в дальнейшем в дополнительных операторах Transact-SQL в вызывающей процедуре или batch.

*  Параметр может быть любого типа данных кроме text или image.

Следующий пример создаёт встроенную процедуру с выходным параметром:

CREATE PROCEDURE dbo.MathTutor

@m1 smallint,

@m2 smallint,

@result smallint OUTPUT

AS

SET @result = @m1*@m2

GO

Вызов этой процедуры может выглядеть следующим образом:

DECLARE @answer smallint

EXEC MathTutor 5,6, @answer OUTPUT

SELECT 'результат ',@answer