我想实现: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”。
有帮助吗?
我想实现: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”。
有帮助吗?
表别名不能以@
开头。所以,给@Temp
另一个别名(或离开了两部分共命名):
SELECT *
FROM @TEMP t
WHERE t.ID = 1;
此外,单等号在SQL传统上用于比较。
在表中使用像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
如果括号的@你可以用它直接
declare @TEMP table (ID int, Name varchar(max))
insert into @temp values (1,'one'), (2,'two')
SELECT * FROM @TEMP
WHERE [@TEMP].[ID] = 1
有一个临时表的另一种方法
create table #TempTable (
ID int,
name varchar(max)
)
insert into #TempTable (ID,name)
Select ID,Name
from Table
SELECT *
FROM #TempTable
WHERE ID = 1
确保你选择正确的数据库。
你已经声明@TEMP,但在你的插入语句中使用了@temp。区分大小写变量名称。
变化@temp到@TEMP
变量不区分大小写。 –
与之相对的是用“@”(例如@parameter)开始通常的参数,临时表需要开始以#(例如#tempTable)。正如GauravSetia所建议的那样,您应该像使用普通表一样声明临时表,但将其命名为#而不是@,并且仅在当前会话中可用,并且在关闭会话时将会放弃。 您还可以拥有一个以##开头的全局临时表(例如## globalTempTable),它可以在会话中使用,并在您关闭创建的会话时丢弃,但我还没有使用过其中之一。
确实有表变量以及临时表。有些时候,他们更喜欢使用和临时表更适合使用的时间。临时表可以编入索引,对于大型数据集更好。对于小数据集,表变量通常更快,并且通常用于SSIS源目标的存储过程中,因为如果使用临时表,SSIS无法找出列,因此如果查询以获取数据很复杂。如果要在回滚之后保留一些数据(例如导致失败的插入数据),则表变量是必需的。 – HLGEM
哦,对不起!谢谢你的回应:我会确保在下次回答之前知道我在说什么。 –
您应该使用散列(#)表,您实际上正在寻找,因为变量值将保留,直到只执行。 例如 -
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。
散列表是存储和检索临时值的最佳选择。它持续很长时间直到父母会话还活着。
'SELECT * FROM @TEMP T WHERE T.ID = 1' – GriGrim