2012-09-13 10 views
5

私はいくつかの値を計算し、SELECTは彼らだストアドプロシージャがあります。私は、テーブル関数にそれを回すことができますが、私はむしろ途中でそのためのRETURNをしないだろう知っている別のSroredプロシージャのストアドプロシージャでSELECTの結果を使用するにはどうすればよいですか?

CREATE PROCEDURE [dbo].[MyProc] 
AS 
    DECLARE @value1 int; 
    DECLARE @value2 int; 
    SET @value1 =... 
    IF(@value1 IS NULL) 
     RETURN 0; 
    SET @value2 =... 
    SELECT @value1 AS Value1, @value2 AS Value2; 
RETURN 0; 

を - 時々あります返すものは一切ありません。

他のストアドプロシージャからそのストアドプロシージャを呼び出し、他のプロシージャでSELECTで取得した値を使用したいとします。それ、どうやったら出来るの?

+0

重複:http://stackoverflow.com/questions/1184325/how-to-call-a-stored-procedure-from-another-stored-procedure – Jodrell

+0

重複したhttp://stackoverflow.com/questions/3039200/tsql-call-a-stored-procedure-another-stored-procedure-and-read-the-result – Jodrell

+0

古いTSQLを扱う前に必ずこのサイトをチェックしてくださいhttp://www.sommarskog.se/share_data .html – Jodrell

答えて

2

魅力的なものを作成し、そこに両方の​​値を挿入することができます。

CREATE TABLE #Temp (value1 int, value2 int) 

INSERT INTO #Temp (value1, value2) 
EXEC [dbo].[MyProc] 

値1が#TEMPには記録できなくなりますが、この場合には、あなたがリターン0

は必要ありません。しかし、それはあなたの目標ではない場合、あなたは0を返す必要がNULLの場合@ value1と@ value2を出力パラメータとして使用する必要があります。

+0

'SELECT'のどの列がテーブルのどの列に入るのかを制御できますか? – sharptooth

+0

はい、ただし、列と型の数が一致している場合のみです。 INSERT INTO #Temp(value1、value2)やINSERT INTO #Temp(value2、value1)と同様に可能です。しかし、EXEC ...文を選択することはできません。ストアドプロシージャからの返品順序が定義されています。 –

+0

この回答は非常に便利です、私はちょうど誘惑の代わりにテーブル変数を使用できることを追加します。 – sharptooth

2

あなたは、出力パラメータを追加することができます

CREATE PROCEDURE [dbo].[MyProc] 
(
    @value1 int = null output, 
    @value2 int = null output 
) 
AS 

    SET @value1 =... 
    IF(@value1 IS NULL) 
     RETURN 0; 
    SET @value2 =... 
    SELECT @value1 = Value1, 
      @value2 = Value2; 
RETURN 0; 

をし、それを使用します。

declare @v1 int, 
     @v2 int 

exec MyProc @v1 out, @v2 out 

select @v1, @v2 

たり、複数の値が必要な場合は

create table #tmp 
(
    val1 int null, 
    val2 int null 
) 

CREATE PROCEDURE [dbo].[MyProc] 
AS 

    SET @value1 =... 
    IF(@value1 IS NULL) 
     RETURN 0; 
    SET @value2 =... 

    insert into #tmp 
    SELECT Value1, Value2 
    from tab 

RETURN 0; 

一時テーブルを使用して、それを使用することができました:

create table #tmp 
(
    val1 int null, 
    val2 int null 
) 

exec MyProc 

select * 
from #tmp 

drop table #tmp 
+0

myprocの最後にあるreturn 0を1に変更することをお勧めします。呼び出したストアドプロシージャ内で 'DECLARE @Exists bit;を実行することができます。 exec @Exists = MyProc;もし@Exists ... Else ... 'は、値1がヌルであった場合にチェックインを許可します。 – Manatherin

+0

もちろん、値を取る方法を示したかっただけです。 – Parado

関連する問題