Использовать результат оператора выбора в другой выбор в хранимой процедуре - PullRequest
1 голос
/ 10 декабря 2011

Как я могу использовать результат оператора select в другой оператор в хранимой процедуре в SQL Server?Я пытаюсь написать этот код

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 голосов
/ 11 декабря 2011

Я решил это. объявить таблицу, содержащую результат первого выбора, и использовать его во втором выборе.

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

Спасибо всем, кто заботится о моем вопросе и тратит свое время на решение моей проблемы

0 голосов
/ 10 декабря 2011

Похоже, на самом деле вам просто нужно сделать один выбор:

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) состоит в том, чтобы определить, как лучше всего построить результаты.Вам не нужно разбивать проблему на отдельные части.

0 голосов
/ 10 декабря 2011

Я не знаю этикета здесь - это комментарий, а не предлагаемый ответ, но я хочу, чтобы людям было проще комментировать мой комментарий ... при необходимости понижать голос ... Я не хочу просто начать новый вопрос, так как я хочу, чтобы ОП это увидело.

У вас есть несколько альтернатив, но никто не говорил о том, почему первый запрос не работал, и не отвечал, как использовать результаты одного запроса в другом.

Почему это не сработало: если таблица «reqTable» существовала и имела столбец с именем «id» во время оценки вашего запроса, SQL Server мог бы связать имя. Вы можете использовать «eval» для помещения в sql, который будет действителен при запуске. Для этой проблемы, которая была бы неоправданно сложной, но такие вещи должны возникнуть, я не знаю, является ли это обычным инструментом в наборе людей, которые пишут много хранимых процедур.

В SQL Server 2005 и 2008 есть функция под названием «CTE», о которой вам следует прочитать, которая отвечает на общий вопрос «Как использовать результаты одного запроса в другом запросе». Они не делают ничего, чего не могут делать подзапросы, но в большинстве случаев их легче писать.

0 голосов
/ 10 декабря 2011

Попробуйте это:

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
)
...