必须声明标量变量(Must declare the scalar variable)

2019-08-31 22:17发布

首先,我已经创建了一个在内存中的表与一列,并利用这些列值我有一个内连接与另一个表。 这样做虽然我得到这个错误:

必须声明标量变量@Temporary。

任何一个可以解释我要去的地方错了吗?

DECLARE @ID INT
Declare @Temporary Table
(
AccountID INT
)  

DECLARE cur CURSOR FOR

SELECT DISTINCT ParentItem from ItemBillOfMaterial

OPEN cur

FETCH NEXT FROM cur INTO @ID;

WHILE @@FETCH_STATUS = 0

BEGIN 

Insert into @Temporary Values(@ID)  

FETCH NEXT FROM cur INTO @ID;

END

SELECT UOM FROM Item

INNER JOIN @Temporary

ON Item.ItemID=@Temporary.AccountID

CLOSE cur;

DEALLOCATE cur;

Answer 1:

你必须使用别名在连接条件引用表时

SELECT UOM FROM Item
INNER JOIN @Temporary t
ON Item.ItemID=t.AccountID

虽然能解决您遇到的问题,你不需要临时表,或光标。 这种查询可以被改写为:

SELECT UOM 
FROM Item
WHERE ItemID IN (SELECT DISTINCT ParentItem FROM ItemBillOfMaterial)


Answer 2:

不知道,你需要使用游标或为一个临时表,我觉得这确实差不多在一个查询

SELECT UOM FROM Item
INNER JOIN (
  SELECT DISTINCT ParentItem AccountID 
  from ItemBillOfMaterial
) Temporary
ON Item.ItemID=Temporary.AccountID


Answer 3:

虽然答案很可能是罚款,岂不是更好地这样做:
SELECT UOM FROM Item WHERE UOM.ItemID IN (SELECT DISTINCT ParentItem FROM ItemBillOfMaterial)
而不是光标获取? 取速度很慢,并根据您的工作上面添加的代码似乎并没有太复杂了。
很抱歉,如果我错了这里,你只是简化专注于你所面临的问题的任务。



文章来源: Must declare the scalar variable