如何在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]
答案 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
感谢所有关心我的问题并花时间解决问题的人