Retornando dados por meio de parâmetros OUTPUT

Caso a palavra-chave OUTPUT seja especificada para um parâmetro na definição do procedimento, o procedimento armazenado poderá retornar o valor atual do parâmetro para o programa de chamada, na saída do procedimento armazenado. Para salvar o valor do parâmetro na variável que poderá ser usada no programa de chamada, o programa de chamada precisará usar a palavra-chave OUTPUT ao executar o procedimento armazenado.

Exemplos

O exemplo a seguir mostra um procedimento armazenado com parâmetros de entrada e de saída. O primeiro parâmetro no procedimento armazenado @SalesPerson recebe o valor de entrada especificado pelo programa de chamada, e o segundo parâmetro @SalesYTD é usado para retornar o valor do programa de chamada. A instrução SELECT usa o parâmetro @SalesPerson para obter o valor correto de SalesYTD, atribuindo o valor ao parâmetro de saída @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

As instruções a seguir executam o procedimento armazenado com um valor para o parâmetro de entrada e salva o valor de saída do procedimento armazenado na variável local @SalesYTD para o programa de chamada.

-- 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

Valores de entrada também podem ser especificados para parâmetros OUTPUT quando o procedimento armazenado é executado. Isso permite que o procedimento armazenado receba um valor do programa de chamada, altere-o ou realize operações com ele e, em seguida, retorne o novo valor para o programa de chamada. No exemplo anterior, pode ser atribuído um valor à variável @SalesYTDBySalesPerson antes da execução do procedimento armazenado. A variável @SalesYTD contém o valor do parâmetro no corpo do procedimento armazenado, e o valor da variável @SalesYTD é retornado para o programa de chamada na saída do procedimento armazenado. Isto é denominado freqüentemente como "capacidade de passagem-por-referência".

Quando OUTPUT é especificado para um parâmetro durante a execução de um procedimento armazenado, e o parâmetro não está definido com OUTPUT no procedimento armazenado, uma mensagem de erro é exibida. É possível executar um procedimento armazenado com parâmetros OUTPUT e não especificar OUTPUT ao executar o procedimento armazenado. Uma mensagem de erro é exibida, mas não se pode usar valor de saída no programa de chamada.