Especificando a direção de um parâmetro

A direção de um parâmetro é dentro, significando que um valor é passado para o parâmetro de entrada do procedimento armazenado, ou fora, significando que o procedimento armazenado retorna um valor ao programa de chamada por meio de um parâmetro de saída. O padrão é um parâmetro de entrada.

Para especificar um parâmetro de saída, você deverá indicar a palavra-chave OUTPUT na definição do parâmetro no procedimento armazenado. O procedimento armazenado retorna o valor atual do parâmetro de saída ao programa de chamada quando o procedimento armazenado existir. O programa de chamada deve também usar a palavra-chave OUTPUT quando for executar o procedimento armazenado a fim de salvar o valor do parâmetro em uma variável que poderá ser usada no programa de chamada. Para obter mais informações, consulte Retornando dados por meio de parâmetros OUTPUT.

Exemplos

O exemplo a seguir cria o procedimento armazenado Production.usp_GetList, que retorna uma lista dos produtos com preços que não excedam um valor especificado. O exemplo mostra o uso de várias instruções SELECT e vários parâmetros OUTPUT. Os parâmetros OUTPUT permitem que um procedimento externo, um lote ou mais de uma instrução Transact-SQL acessem um valor definido durante a execução do procedimento.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID ( 'Production.uspGetList', 'P' ) IS NOT NULL 
    DROP PROCEDURE Production.uspGetList;
GO
CREATE PROCEDURE Production.uspGetList @Product varchar(40) 
    , @MaxPrice money 
    , @ComparePrice money OUTPUT
    , @ListPrice money OUT
AS
    SET NOCOUNT ON;
    SELECT p.[Name] AS Product, p.ListPrice AS 'List Price'
    FROM Production.Product AS p
    JOIN Production.ProductSubcategory AS s 
      ON p.ProductSubcategoryID = s.ProductSubcategoryID
    WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice;
-- Populate the output variable @ListPprice.
SET @ListPrice = (SELECT MAX(p.ListPrice)
        FROM Production.Product AS p
        JOIN  Production.ProductSubcategory AS s 
          ON p.ProductSubcategoryID = s.ProductSubcategoryID
        WHERE s.[Name] LIKE @Product AND p.ListPrice < @MaxPrice);
-- Populate the output variable @compareprice.
SET @ComparePrice = @MaxPrice;
GO

Execute usp_GetList para retornar uma lista de produtos (bicicletas) da Adventure Works que custam menos que $ 700. Os parâmetros OUTPUT @cost e @ compareprices são usados com linguagem controle-de-fluxo para retornar uma mensagem na janela Mensagens.

ObservaçãoObservação

A variável OUTPUT deve ser definida durante a criação do procedimento como também durante o uso da variável. O nome de parâmetro e o nome de variável não precisam coincidir. Porém, o tipo de dado e o posicionamento do parâmetro devem coincidir (a menos que @ listprice= variable seja usado).

DECLARE @ComparePrice money, @Cost money 
EXECUTE Production.uspGetList '%Bikes%', 700, 
    @ComparePrice OUT, 
    @Cost OUTPUT
IF @Cost <= @ComparePrice 
BEGIN
    PRINT 'These products can be purchased for less than 
    $'+RTRIM(CAST(@ComparePrice AS varchar(20)))+'.'
END
ELSE
    PRINT 'The prices for all products in this category exceed 
    $'+ RTRIM(CAST(@ComparePrice AS varchar(20)))+'.'

Veja, a seguir, o conjunto parcial dos resultados:

Product                                            List Price
-------------------------------------------------- ------------------
Road-750 Black, 58                                 539.99
Mountain-500 Silver, 40                            564.99
Mountain-500 Silver, 42                            564.99
...
Road-750 Black, 48                                 539.99
Road-750 Black, 52                                 539.99

(14 row(s) affected)

These items can be purchased for less than $700.00.