1. ホーム
  2. tsql

[解決済み] T-SQL ストアドプロシージャのSELECTされた値を取得する

2023-01-18 12:33:59

質問

T-SQLでは、これは許可されています。

DECLARE @SelectedValue int
SELECT @SelectedValue = MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1

つまり、SELECTの値を取得して変数に詰め込むことは可能です(当然スカラーであることが条件ですが)。

同じSELECTのロジックをストアドプロシージャに入れたら

CREATE PROCEDURE GetMyInt
AS
SELECT MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1

このストアドプロシージャの出力を取得して変数に詰め込むことは可能でしょうか?

のようなものです。

DECLARE @SelectedValue int
SELECT @SelectedValue = EXEC GetMyInt

(上の構文が許されないことは、私が試したので知っています!)

どのように解決するのですか?

RETURN値、OUTPUTパラメータ、結果セットの3つの方法があります。

ALSO、パターンを使用する場合は注意してください。 SELECT @Variable=column FROM table ...

を使用すると、クエリから返された行が複数ある場合、@Variable にはクエリから返された最後の行の値のみが格納されます。

返される値

あなたのクエリはintフィールドを返すので、少なくともあなたがそれを命名した方法に基づいて、あなたはこのトリックを使用することができます。

CREATE PROCEDURE GetMyInt
( @Param int)
AS
DECLARE @ReturnValue int

SELECT @ReturnValue=MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param
RETURN @ReturnValue
GO

というように、プロシージャを呼び出します。

DECLARE @SelectedValue int
       ,@Param         int
SET @Param=1
EXEC @SelectedValue = GetMyInt @Param
PRINT @SelectedValue

RETURNは単一のint値しか返せず、nullは0に変換されるため、これはintに対してのみ機能します。

出力パラメータ

を使うと、出力パラメータを使うことができます。

CREATE PROCEDURE GetMyInt
( @Param     int
 ,@OutValue  int OUTPUT)
AS
SELECT @OutValue=MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param
RETURN 0
GO

というように、プロシージャを呼び出します。

DECLARE @SelectedValue int
       ,@Param         int
SET @Param=1
EXEC GetMyInt @Param, @SelectedValue OUTPUT
PRINT @SelectedValue 

出力パラメータは1つの値しか返すことができませんが、任意のデータ型にすることができます。

結果セット のようなプロシージャを作成します。

CREATE PROCEDURE GetMyInt
( @Param     int)
AS
SELECT MyIntField FROM MyTable WHERE MyPrimaryKeyField = @Param
RETURN 0
GO

のように使う。

DECLARE @ResultSet table (SelectedValue int)
DECLARE @Param int
SET @Param=1
INSERT INTO @ResultSet (SelectedValue)
    EXEC GetMyInt @Param
SELECT * FROM @ResultSet 

結果セットは多くの行と多くの列を持つことができ、そのデータ型は問いません。