SQL临时表变量

时间:2013-08-01 13:23:15

标签: sql-server tsql

我正在努力实现:

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

任何帮助?

8 个答案:

答案 0 :(得分:44)

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

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

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

答案 1 :(得分:16)

在表中使用别名,如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 

答案 2 :(得分:10)

还有另一种临时表的方法

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

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

SELECT * 
FROM #TempTable
WHERE ID  = 1 

确定您正在选择正确的数据库。

答案 3 :(得分:8)

如果您将@括起来,可以直接使用

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

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

答案 4 :(得分:1)

你应该使用hash(#)表,你实际上正在寻找,因为变量值将保持到只执行。 例如 -

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。

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

答案 5 :(得分:0)

尝试以下查询:

SELECT ID,
   Name
INTO #tempTable
FROM Table

SELECT *
FROM #tempTable
WHERE ID = 1

不需要声明表。

答案 6 :(得分: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<>fiddle demo

答案 7 :(得分:-4)

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

将@temp更改为@TEMP