web-dev-qa-db-ja.com

T-SQLは、ストアドプロシージャの選択された値を取得します

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

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

そのため、SELECTの値を取得して変数に入れることができます(明らかにスカラーである場合)。

ストアドプロシージャに同じ選択ロジックを配置した場合:

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

このストアドプロシージャの出力を取得して変数に入れることはできますか?

何かのようなもの:

DECLARE @SelectedValue int
SELECT @SelectedValue = EXEC GetMyInt

(試してみたので、上記の構文は許可されていません!)

92
David

使用できる方法は3つあります。RETURN値、およびOUTPUTパラメーターと結果セット

また、次のパターンを使用する場合は注意してください: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

これはINTでのみ機能します。RETURNは単一のint値のみを返すことができ、nullはゼロに変換されるためです。

出力パラメーター
出力パラメーターを使用できます。

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つの値のみを返すことができますが、任意のデータ型にすることができます

RESULT SET結果セットの場合、次のような手順を実行します。

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 

結果セットには、任意のデータ型の多くの行と列を含めることができます

186
KM.

組み合わせもあります。レコードセットで戻り値を使用できます。

-ストアドプロシージャ-

CREATE PROCEDURE [TestProc]

AS
BEGIN

    DECLARE @Temp TABLE
    (
        [Name] VARCHAR(50)
    )

    INSERT INTO @Temp VALUES ('Mark') 
    INSERT INTO @Temp VALUES ('John') 
    INSERT INTO @Temp VALUES ('Jane') 
    INSERT INTO @Temp VALUES ('Mary') 

    -- Get recordset
    SELECT * FROM @Temp

    DECLARE @ReturnValue INT
    SELECT @ReturnValue = COUNT([Name]) FROM @Temp

    -- Return count
    RETURN @ReturnValue

END

-呼び出しコード-

DECLARE @SelectedValue int
EXEC @SelectedValue = [TestProc] 

SELECT @SelectedValue

- 結果 -

enter image description here

4
markpcasey

戻り値を使用する必要があります。

DECLARE @SelectedValue int

CREATE PROCEDURE GetMyInt (@MyIntField int OUTPUT)
AS
SELECT @MyIntField = MyIntField FROM MyTable WHERE MyPrimaryKeyField = 1

次に、次のように呼び出します。

EXEC GetMyInt OUTPUT @SelectedValue
2
user151323

これを試してください:

EXEC @SelectedValue = GetMyInt
2
Code Wolfe