【问题标题】:Use result of selection statement into another selection in stored procedure将选择语句的结果用于存储过程中的另一个选择
【发布时间】:2011-12-10 14:33:36
【问题描述】:

如何在 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]

【问题讨论】:

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


    【解决方案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 
        ProductName 
    FROM 
        RequestProduct 
    WHERE
        RequestId in
    (
        select id
        from reqtable
    )
    

    【讨论】:

      【解决方案2】:

      听起来您实际上只需要进行一次选择:

      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 产品)的工作是找出如何最好地构建结果。您不必将问题分解为单独的部分。

      【讨论】:

        【解决方案3】:

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

        您有一些替代方案,但没有人谈论为什么第一个查询不起作用或回答如何将一个查询的结果用于另一个查询。

        为什么它不起作用:如果表“reqTable”存在并且在评估您的查询时有一个名为“id”的列,则 SQL Server 可能已经绑定了该名称。您可以使用“eval”输入运行时有效的 sql。对于这个复杂到无理取闹的问题,却必须要出现这样的事情,不知道是不是写很多存储过程的人工具箱里的常规工具。

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

        【讨论】:

        • 除了 CTE 之外,还有使用临时表 (#hello) 的选项,该表仅对存储过程可见(除非它已经存在于堆栈中的某个位置,但使用不应该的巧妙命名) t 是一个问题)或者可以使用一个表变量(它有自己的起伏)。就我个人而言,我是临时表的忠实粉丝,因为(恕我直言)它的缺点最少,并且几乎可以对小型和大型数据集进行所有操作。
        【解决方案4】:

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

        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
        

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

        【讨论】:

          猜你喜欢
          • 2021-08-04
          • 1970-01-01
          • 1970-01-01
          • 2019-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-05
          • 1970-01-01
          相关资源
          最近更新 更多