Возвращение данных с помощью параметров OUTPUT

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

Примеры

Следующий пример представляет хранимую процедуру с входным и выходным параметрами. Первый параметр в хранимой процедуре @SalesPerson получает входное значение, указанное вызываемой программой, а второй параметр @SalesYTD используется для возврата значения вызываемой программе. Инструкция SELECT использует параметр @SalesPerson для получения правильного значения SalesYTD и присваивает это значение выходному параметру @SalesYTD.

USE AdventureWorks2008R2;
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.BusinessEntityID = sp.BusinessEntityID
    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 при выполнении хранимой процедуры. Сообщение об ошибке не будет выдаваться, но нельзя будет использовать выходное значение в вызываемой программе.