使用 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。这样不会返回错误,但将无法在调用程序中使用输出值。