Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 必须声明标量变量_Sql_Sql Server 2008 - Fatal编程技术网

Sql 必须声明标量变量

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

首先,我创建了一个包含一列的内存表,并使用这些列值与另一个表进行内部联接。执行此操作时,我遇到以下错误:

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

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

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专家可以提供一个更好的理由来解释为什么,我认为这只是微软方面对解析器的简化。谢谢你的帮助。这很有趣。谢谢你的回复…我正在学习如何使用该查询使用游标。