2011-12-10 6 views
1

selectステートメントの結果をSQL Serverのストアドプロシージャの別のステートメントに使用するにはどうすればよいですか?あなたは、SQLで、一般的に選択ステートメントの結果をストアドプロシージャの別の選択に使用する

SELECT 
    u.RequestId, 
    r.UserId, 
    rp.ProductName 
FROM 
    [User] u 
     inner join 
    [Request] r 
     on 
      r.UserId = u.UserId 
     inner join 
    RequestProduct rp 
     on 
      rp.RequestId = r.RequestId 
WHERE 
    r.RequestId = @Id 

CREATE procedure [dbo].[ShowRequest] (@Id int) 

AS 

SELECT 

    Request.RequestId, 
    Request.UserId 

INTO 
    reqTable   
FROM 
    [User],[Request] 
WHERE 
    Request.UserId = [User].UserId 
AND 
    Request.RequestId = Id 

/*another selection*/ 
SELECT 
    ProductName 
FROM 
    RequestProduct 
WHERE 
    RequestId in 
(
    select id 
    from reqtable 
) 

答えて

0

はこれを試してみてくださいこのコードを書いてみるのですあなたが達成しようとしている全体的な結果を決定し、それを単一のステートメントとして表現しようとする必要があります - SQL Serverの仕事(またはSQL製品)は、問題を別々の部分に分解する必要はありません。

0

あなたが実際に1つだけ選択を行う必要があるようですね:私は

CREATE procedure [dbo].[ShowRequest] (@Id int) 
AS 
    SELECT 
    Request.RequestId, 
    Request.UserId 
    INTO 
    reqTable  
    FROM 
    [User],[Request] 
    WHERE 
    Request.UserId = [User].UserId 
    AND 
    Request.RequestId = Id 

    /*another selection*/ 
    SELECT 
    RequestProduct.ProductName 
    FROM 
    RequestProduct 
    /*ERROR:The multi-part identifier "ReqTable.id" could not be bound*/  
    WHERE  
    RequestProduct.RequestId = ReqTable.[id] 
0

私はここのエチケットを知らない - これはコメントではありませんが、私のコメントにコメントしやすいようにしたいと思っています... downvote適宜...私はしたくないOPにこれを見てもらいたいので、新しい質問を始めてください。

いくつかの選択肢がありますが、最初のクエリが機能しなかった理由や、あるクエリの結果を別のクエリに使用する方法については誰も話していません。

なぜ動作しないのですか:クエリが評価された時点でテーブル "reqTable"が存在し、 "id"という名前の列がある場合、SQL Serverはその名前にバインドする可能性があります。 "eval"を使用すると、実行時に有効になるsqlを入れることができます。不公平に複雑になるこの問題については、このようなものが出てくるはずですが、ストアドプロシージャをたくさん書く人のツールボックスでは、それが正規のツールかどうかはわかりません。

SQL Server 2005と2008の両方に「CTE」という機能があります。「CTE」という機能については、「別のクエリで1つのクエリの結果を使用するにはどうすればよいですか?彼らは絶対に行うことのできないサブクエリを何もしませんが、ほとんどの時間は書くのが簡単です。

+0

を解決するために自分の時間を過ごす皆のためのおかげで離れてCTEのからの唯一の保存に表示されます一時テーブルを使用するオプション(#hello)もあります(スタックに沿ったどこかにすでに存在していないが問題ではないはずの巧妙な命名法を使用していない限り)、またはテーブル変数を使用することができます(独自の起伏があります)。個人的に私は一時テーブルの大きなファンです(IMHO)それは最小限のダウンサイドを持っており、小さなデータセットと大規模なデータセットのほとんどすべての操作を可能にします。 – deroby

0

私はそれを解決しました。表を宣言すると、最初の選択の結果が含まれ、2番目の選択で使用されます。

CREATE procedure [dbo].[ShowRequest] (@Id int) 
AS 

DECLARE @reqTable TABLE 
(
    ReqID int, 
    UserID int 
) 

INSERT INTO 
    @reqTable 
SELECT 
Request.RequestId AS 'ReqID', 
Request.UserId 

FROM 
[User],[Request] 
WHERE 
Request.UserId = [User].UserId 
AND 
Request.RequestId = Id 

/*another selection*/ 
SELECT 
RequestProduct.ProductName 
FROM 
    RequestProduct,@reqTable 

WHERE  
    RequestProduct.RequestId = ReqID 

私の質問を気にして私の問題

関連する問題