Возвращение данных с помощью параметров OUTPUT
При указании ключевого слова OUTPUT для параметра в определении процедуры хранимая процедура может возвращать текущее значение параметра вызываемой программе при завершении работы. Чтобы сохранить значение параметра в переменной, которая может быть использована в вызываемой программе, при выполнении хранимой процедуры вызываемая программа должна использовать ключевое слово OUTPUT.
Примеры
Следующий пример представляет хранимую процедуру с входным и выходным параметрами. Первый параметр в хранимой процедуре @SalesPerson получает входное значение, указанное вызываемой программой, а второй параметр @SalesYTD используется для возврата значения вызываемой программе. Инструкция SELECT использует параметр @SalesPerson для получения правильного значения SalesYTD и присваивает это значение выходному параметру @SalesYTD.
USE AdventureWorks;
GO
IF OBJECT_ID('Sales.uspGetEmployeeSalesYTD', 'P') IS NOT NULL
DROP PROCEDURE Sales.uspGetEmployeeSalesYTD;
GO
CREATE PROCEDURE Sales.uspGetEmployeeSalesYTD
@SalesPerson nvarchar(50),
@SalesYTD money OUTPUT
AS
SET NOCOUNT ON;
SELECT @SalesYTD = SalesYTD
FROM Sales.SalesPerson AS sp
JOIN HumanResources.vEmployee AS e ON e.EmployeeID = sp.SalesPersonID
WHERE LastName = @SalesPerson;
RETURN
GO
Следующие инструкции выполняют хранимую процедуру со значением для входного параметра и сохраняют выходное значение хранимой процедуры в переменную @SalesYTD, локализованную в вызываемой программе.
-- Declare the variable to receive the output value of the procedure.
DECLARE @SalesYTDBySalesPerson money;
-- Execute the procedure specifying a last name for the input parameter
-- and saving the output value in the variable @SalesYTDBySalesPerson
EXECUTE Sales.uspGetEmployeeSalesYTD
N'Blythe', @SalesYTD = @SalesYTDBySalesPerson OUTPUT;
-- Display the value returned by the procedure.
PRINT 'Year-to-date sales for this employee is ' +
convert(varchar(10),@SalesYTDBySalesPerson);
GO
Входные значения также могут быть указаны для параметров OUTPUT при выполнении хранимой процедуры. Это позволяет хранимой процедуре получать значение из вызываемой программы, изменять его или выполнять операции с этим значением, а затем возвращать новое значение вызываемой программе. В предыдущем примере переменной @SalesYTDBySalesPerson может быть присвоено значение до выполнения хранимой процедуры. Переменная @SalesYTD содержит значение параметра в теле хранимой процедуры, и значение переменной @SalesYTD возвращается вызываемой программе, когда хранимая процедура завершает работу. Часто это называется «возможностью передачи по ссылке».
Если при выполнении хранимой процедуры указано OUTPUT для параметра, а параметр не указан при помощи OUTPUT в хранимой процедуре, выдается сообщение об ошибке. Можно выполнять хранимую процедуру с параметрами OUTPUT и не указывать OUTPUT при выполнении хранимой процедуры. Сообщение об ошибке не будет выдаваться, но нельзя будет использовать выходное значение в вызываемой программе.
См. также