将选择语句的结果用于存储过程中的另一个选择

时间:2011-12-10 14:33:37

标签: sql-server sql-server-2005 sql-server-2008

如何在SQL Server的存储过程中将select语句的结果用于另一个语句?我试着写这段代码

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]

4 个答案:

答案 0 :(得分:0)

试试这个:

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
)

答案 1 :(得分:0)

听起来你实际上只需做一个选择:

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

通常,使用SQL,您应该确定要尝试实现的总体结果,然后尝试将其表达为单个语句 - SQL Server的工作(或任何SQL产品)将确定如何最好地构建结果。您不必将问题分解为单独的部分。

答案 2 :(得分:0)

我不知道这里的礼节 - 这是一个评论而不是一个建议的答案,但我想让人们更容易评论我的评论......酌情投票...我不想只是开始一个新问题,因为我希望OP看到这个。

你有一些选择,但没有人谈到为什么第一个查询不起作用或者回答如何将一个查询的结果用于另一个查询。

为什么它不起作用:如果表“reqTable”存在并且在评估查询时有一个名为“id”的列,则SQL Server可能已绑定该名称。您可以使用“eval”放入在运行时有效的sql。对于这个不合理的问题,但是这样的问题必定会出现,我不知道它是否是编写大量存储过程的人的工具箱中的常规工具。

SQL Server 2005和2008都有一个名为“CTE”的功能,您应该阅读该功能,以解决“如何在另一个查询中使用一个查询的结果”的一般问题。他们不做任何子查询绝对做不到的事情,但大多数时候他们更容易写。

答案 3 :(得分:0)

我已经解决了。声明一个表包含第一个选择的结果,并在第二个选择中使用它。

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

感谢所有关心我的问题并花时间解决问题的人