44

我正在努力实现:

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”。

我究竟做错了什么?

4

8 回答 8

52

表别名不能以@. 所以,给@Temp另一个别名(或完全省略两部分命名):

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

此外,传统上在 SQL 中使用单个等号进行比较。

于 2013-08-01T13:24:29.310 回答
17

要么在表中使用 Allias,如 T 并使用 T.ID,要么只使用列名。

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

SELECT * FROM @TEMP 
WHERE ID  = 1 
于 2013-08-01T13:24:08.973 回答
13

临时表还有另一种方法

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

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

SELECT * 
FROM #TempTable
WHERE ID  = 1 

确保您选择了正确的数据库。

于 2015-06-12T06:38:38.660 回答
8

如果你把@括起来,你可以直接使用它

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

SELECT * FROM @TEMP 
WHERE [@TEMP].[ID] = 1
于 2013-08-01T14:12:10.000 回答
1

您应该使用哈希 (#) 表,这是您实际寻找的,因为变量值将一直保留到该执行。例如 -

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。

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

于 2017-07-21T05:54:20.720 回答
0

尝试以下查询:

SELECT ID,
   Name
INTO #tempTable
FROM Table

SELECT *
FROM #tempTable
WHERE ID = 1

它不需要声明表。

于 2020-04-07T08:34:36.203 回答
0

@TEMP如果您引用标识符,您仍然可以使用"@TEMP"

declare @TEMP table (ID int, Name varchar(max));
insert into @temp SELECT 1 AS ID, 'a' Name;

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

db<>小提琴演示

于 2020-04-11T06:50:55.243 回答
-4

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

将@temp 更改为@TEMP

于 2015-06-18T15:04:57.840 回答