Sql 必须声明标量变量
首先,我创建了一个包含一列的内存表,并使用这些列值与另一个表进行内部联接。执行此操作时,我遇到以下错误: 必须声明标量变量@Temporary 谁能解释一下我哪里出了问题Sql 必须声明标量变量,sql,sql-server-2008,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
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;
在联接条件中引用表时,必须使用别名
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)
不确定是否需要游标或临时表,我认为在一个查询中也需要这样做
SELECT UOM FROM Item
INNER JOIN (
SELECT DISTINCT ParentItem AccountID
from ItemBillOfMaterial
) Temporary
ON Item.ItemID=Temporary.AccountID
虽然答案可能很好,但这样做不是更好吗:
从项目中选择计量单位,其中UOM.ItemID位于从ItemBillOfMaterialInstance中选择不同的父项目而不是光标提取?Fetch非常慢,并且基于您在上面添加的代码,作业似乎并不太复杂。如果我在这里出错,很抱歉,您只是简化了任务以关注您面临的问题。您能否解释为什么我必须使用alias。Item table没有AccountID列。我相信一个SQL server专家可以提供一个更好的理由来解释为什么,我认为这只是微软方面对解析器的简化。谢谢你的帮助。这很有趣。谢谢你的回复…我正在学习如何使用该查询使用游标。