Devolver datos mediante parámetros OUTPUT

Si especifica la palabra clave OUTPUT para un parámetro en la definición del procedimiento, éste, al salir, podrá devolver el valor actual del parámetro al programa que lo llama. Para guardar el valor del parámetro en una variable que pueda utilizarse en el programa que realiza la llamada, este último debe utilizar la palabra clave OUTPUT para ejecutar el procedimiento almacenado.

Ejemplos

En el ejemplo siguiente se muestra un procedimiento almacenado con un parámetro de entrada y otro de salida. El primer parámetro del procedimiento almacenado @SalesPerson recibe el valor de entrada especificado por el programa que realiza la llamada, mientras que el segundo parámetro @SalesYTD se utiliza para devolver el valor a dicho programa. La instrucción SELECT utiliza el parámetro @SalesPerson para obtener el valor SalesYTD correcto y asignarlo, a continuación, al parámetro de salida @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

Las instrucciones siguientes ejecutan el procedimiento almacenado con un valor para el parámetro de entrada y guardan el valor de salida del procedimiento en la variable local @SalesYTD del programa que efectúa la llamada.

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

También es posible especificar los valores de entrada para los parámetros OUTPUT cuando se ejecuta el procedimiento almacenado. Esto permite al procedimiento recibir un valor del programa que realiza la llamada, cambiarlo o realizar operaciones con él, y devolver el nuevo valor al programa. En el ejemplo anterior, es posible asignar un valor a la variable @SalesYTDBySalesPerson antes de ejecutar el procedimiento almacenado. La variable @SalesYTD contiene el valor del parámetro en el cuerpo del procedimiento almacenado, y el valor de la variable @SalesYTD es devuelto al programa que realiza la llamada al finalizar el procedimiento. A esto se le suele denominar "capacidad de paso por referencia".

Si especifica OUTPUT para un parámetro cuando ejecuta un procedimiento almacenado y el parámetro no se define mediante OUTPUT en el procedimiento, se emite un mensaje de error. Puede ejecutar un procedimiento con parámetros OUTPUT y no especificar OUTPUT al ejecutar el procedimiento. No se devuelve ningún error, pero no podrá utilizar el valor de salida en el programa que realiza la llamada.