我正在努力实现:
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”。
任何帮助?
答案 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 ;
答案 7 :(得分:-4)
您已声明@TEMP但在您的insert语句中使用了@temp。区分大小写的变量名。
将@temp更改为@TEMP