必须声明标量变量

时间:2013-04-23 11:47:46

标签: sql sql-server-2008

首先,我创建了一个包含一列的内存表,并使用这些列值,我有一个内部连接与另一个表。这样做的同时我收到了这个错误:

  

必须声明标量变量 @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;

3 个答案:

答案 0 :(得分:6)

在引用连接条件中的表时,必须使用别名

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)

答案 1 :(得分:0)

不确定您是否需要游标或临时表,我认为这在一个查询中的作用相同

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

答案 2 :(得分:0)

虽然答案可能还不错,但这样做会不会更好:
SELECT UOM FROM Item WHERE UOM.ItemID IN (SELECT DISTINCT ParentItem FROM ItemBillOfMaterial)
而不是游标提取?抓取速度非常慢,根据您在上面添加的代码,工作似乎并不太复杂。
对不起,如果我在这里错了,您只是简化了任务,专注于您面临的问题。