2013-08-01 100 views
22

我想实现:SQL临时表变量

declare @TEMP table (ID int, Name varchar(max)) 
insert into @temp SELECT ID, Name FROM Table 

SELECT * FROM @TEMP 
WHERE @TEMP.ID = 1  <--- ERROR AT @TEMP.ID 

而是一个错误而

必须声明标量变量 “@temp”。

有帮助吗?

+3

'SELECT * FROM @TEMP T WHERE T.ID = 1' – GriGrim

回答

26

表别名不能以@开头。所以,给@Temp另一个别名(或离开了两部分共命名):

SELECT * 
FROM @TEMP t 
WHERE t.ID = 1; 

此外,单等号在SQL传统上用于比较。

10

在表中使用像T这样的Allias,并使用T.ID,或者只使用列名。

declare @TEMP table (ID int, Name varchar(max)) 
insert into @temp SELECT ID, Name FROM Table 

SELECT * FROM @TEMP 
WHERE ID = 1 
7

如果括号的@你可以用它直接

declare @TEMP table (ID int, Name varchar(max)) 
insert into @temp values (1,'one'), (2,'two') 

SELECT * FROM @TEMP 
WHERE [@TEMP].[ID] = 1 
3

有一个临时表的另一种方法

create table #TempTable (
ID int, 
name varchar(max) 
) 

insert into #TempTable (ID,name) 
Select ID,Name 
from Table 

SELECT * 
FROM #TempTable 
WHERE ID = 1 

确保你选择正确的数据库。

-4

你已经声明@TEMP,但在你的插入语句中使用了@temp。区分大小写变量名称。

变化@temp到@TEMP

+2

变量不区分大小写。 –

-1

与之相对的是用“@”(例如@parameter)开始通常的参数,临时表需要开始以#(例如#tempTable)。正如GauravSetia所建议的那样,您应该像使用普通表一样声明临时表,但将其命名为#而不是@,并且仅在当前会话中可用,并且在关闭会话时将会放弃。 您还可以拥有一个以##开头的全局临时表(例如## globalTempTable),它可以在会话中使用,并在您关闭创建的会话时丢弃,但我还没有使用过其中之一。

+1

确实有表变量以及临时表。有些时候,他们更喜欢使用和临时表更适合使用的时间。临时表可以编入索引,对于大型数据集更好。对于小数据集,表变量通常更快,并且通常用于SSIS源目标的存储过程中,因为如果使用临时表,SSIS无法找出列,因此如果查询以获取数据很复杂。如果要在回滚之后保留一些数据(例如导致失败的插入数据),则表变量是必需的。 – HLGEM

+0

哦,对不起!谢谢你的回应:我会确保在下次回答之前知道我在说什么。 –

0

您应该使用散列(#)表,您实际上正在寻找,因为变量值将保留,直到只执行。 例如 -

declare @TEMP table (ID int, Name varchar(max)) 
insert into @temp SELECT ID, Name FROM Table 

当上面两条和下面两条语句单独执行时。

SELECT * FROM @TEMP 
WHERE @TEMP.ID = 1 

错误将显示,因为第二次执行查询批次时丢失的变量值。 当你运行整个代码块时,它肯定会给出o/p。

散列表是存储和检索临时值的最佳选择。它持续很长时间直到父母会话还活着。