OUTPUT パラメータを使用してデータを返す処理

プロシージャの定義でパラメータに OUTPUT キーワードを指定すると、ストアド プロシージャの終了時にそのパラメータの現在値を呼び出し側のプログラムに返すことができます。呼び出し側のプログラムで使用できる変数にパラメータの値を保存するには、呼び出し側のプログラムがストアド プロシージャを実行する際に OUTPUT キーワードを使用する必要があります。

次の例では、入力パラメータと出力パラメータを使用するストアド プロシージャを示します。ストアド プロシージャの最初のパラメータ @SalesPerson は、呼び出し側のプログラムが指定する入力値を受け取り、2 番目のパラメータ @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 を指定せずにこのストアド プロシージャを実行することも可能です。エラーは返されませんが、呼び出し側のプログラムで出力値を使用することはできません。