2009-02-20 10 views
6

私はこの値を取得する必要がある他のストアドプロシージャから値を呼び出すストアドプロシージャを持っています。呼び出しストアドプロシージャはトランザクション内にあり、値を返す(実際には値を作成し、それ以外のprocが渡されないテーブルに格納する)ストアドプロシージャは、独自のトランザクション内ではなく、呼び出し元のトランザクションの一部になります。ストアドプロシージャの戻り値をSQLの変数に代入する最も良い方法は何ですか?

これは、ストアドプロシージャの戻り値を取得し、呼び出し側のプロシージャの変数に格納する最も効率的な方法は何ですか?

現在、私は以下のことがあり、非常に非効率かどうか疑問に思っていますか?

DECLARE @tmpNewValue TABLE (newvalue int) 
INSERT INTO @tmpNewValue EXEC GetMyValue 

DECLARE @localVariable int 
SET @localVariable = (SELECT TOP 1 newvalue FROM @tmpNewValue) 

もっと簡単な方法はありませんか?これは高価なものではありませんか?

保存されたprocに出力パラメータがありません。ただ値を返します。出力パラメータを使用する方が高速でしょうか?

declare @localVariable int 
exec @localVariable =GetMyValue 
select @localVariable 

答えて

13

を使用している価値がある何のため

1行と1列、または行セットがまったくなく、リターンコードをキャプチャしたいだけですか?

あなただけのリターンコードをしたい場合は、ジョシュの方法は、それはあなたが、私はこのコード

use tempdb 
go 

create proc GetMyValue 
as 
select 1 
go 


create table #temp (id int) 
declare @localVariable int 

insert #temp 
exec @localVariable =GetMyValue 
select @localVariable,* from #temp 
+0

興味深いが、構築物が有効であったことを知りませんでした。したがって、私が与えた例は、一時テーブルを作成することです。それが何万回も呼ばれていないと、それは非常に非効率的か、それとも非常に顕著ではないでしょうか? – ApplePieIsGood

+0

あなたのテーブルはテーブル変数なので、すべてがメモリ内にあるはずです。あなたのシステム上でテストを実行してみて、その違いを測定してみませんか? – JoshBerke

1

が、これはの行セットを返す発動です:それはあなたが、その後、はい、これはあなたが行うことができますinnefficentされた単一の戻り変数を取得した場合、私はMS SQL Server 2005の

3

を実行して何を意味するかを説明することになりました

をやっているよりもはるかに高速になりますsicne OUTPUTパラメータを使用してそれ以外の使用How to Share Data Between Stored Procedures
「exec @localVariable = GetMyValue」は私にとっては機能しません(MS SQL 2005)。これは常に0の値(They have the same issue)を返します。

私の意見は
ストアドプロシージャを変更できる場合は、出力パラメータを追加してください。
プロシージャを削除できる場合は、関数として書き換えます。
それ以外の場合は、テーブル変数を使用します。

+1

procに戻り値がないか、エラーが発生しない限り、常に0になります。 – SQLMenace

+0

戻り値のみに興味があります。 Joshのメソッドを使用するのは、出力パラメータよりも遅くても速くてもかまいません。戻り値または特定の値を取得するだけです(戻り値でなくても、このproc内で作成した値)。どちらか速いですが、私は現在やっている。 – ApplePieIsGood

+0

2SQLMenace - はい、そうです。それはリターンで動作します。 –

0

はこのお試しください:

create proc AvilableSeats 
as 
declare @v1 int,@v2 int 
exec @v1= determinPath_Capacity 1,'Sat-Tue',32 
exec @v2=Student_fGroup '6/12/2009' 
select @[email protected] 
関連する問題