T-SQLはストアドプロシージャのSELECTed値を取得します


95

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

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

回答:


191

使用できる方法は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

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

OUTPUT PARAMETER
では、出力パラメーターを使用できます。

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 

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


5
結果セットのアプローチでは、1つのレコードしか返されない場合でも、このテーブル/挿入の使用法が必要です。変数への直接のショートカットを探していましたが、ありません。
goodeye 2014年

複数行の結果で「戻り値」と「出力パラメータ」アプローチを使用することは可能ですか?
ji-ruh

@ ji-ruh、ストアドプロシージャでは、結果セット、戻り出力パラメーター、および/または戻り値
KMの

4

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

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

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

- 結果 -

ここに画像の説明を入力してください


phpでこの結果を取得するにはどうすればよいですか?
HagaHood 2017年

3

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

DECLARE @SelectedValue int

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

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

EXEC GetMyInt OUTPUT @SelectedValue

2

これを試してください:

EXEC @SelectedValue = GetMyInt

7
これは誤りです。SELECTステートメントは、SPROC内で指定されていない限り、SPROCの戻り値にはなりません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.