SQL:如果基表发生更改,在稍后调用时临时表是否返回不同的结果?
假设我有以下几点:SQL:如果基表发生更改,在稍后调用时临时表是否返回不同的结果?,sql,sql-server,tsql,sql-server-2008-r2,Sql,Sql Server,Tsql,Sql Server 2008 R2,假设我有以下几点: --Section 1 SELECT * INTO #TEMP1 FROM TABLEA --Section 2 /*more code here*/ --Section 3 SELECT * FROM #TEMP1 在第2节的处理过程中,表A发生了显著变化。在第3节,我的临时表是将原始选择的结果返回到中,还是现在从表中返回当前结果?临时表没有链接,也不知道它是如何填充的。事实上,选择。。。INTO只是填充临时表的一种方法。它可以由多个不同的语句填充,更新或删除一些数据
--Section 1
SELECT * INTO #TEMP1 FROM TABLEA
--Section 2
/*more code here*/
--Section 3
SELECT * FROM #TEMP1
在第2节的处理过程中,表A发生了显著变化。在第3节,我的临时表是将原始选择的结果返回到中,还是现在从表中返回当前结果?临时表没有链接,也不知道它是如何填充的。事实上,选择。。。INTO只是填充临时表的一种方法。它可以由多个不同的语句填充,更新或删除一些数据,等等 它不关心数据来自何处,只存储插入其中的行。在大多数方面,它和其他桌子一样 如果您想要存储查询的内容而不是一组结果,也就是说,如果您希望它始终反映当前状态,您可以通过使用适当的选项集定义一个游标,使其成为一个动态游标来获得类似的内容
但几乎总是,对于任何问题,光标都是错误的答案,并且它在以后的查询中不能像临时表那样直接使用。否。表是创建时的快照-除非您使用DML数据修改语言(如insert、delete、update、,截断 如果希望基表发生更改,请使用视图:
create v_tableA as
select a.*
from TABLEA a;
调用时将重新计算,因此它会随基表而更改。正如@TaPaKaHUA所述,TEMP1中的数据不会更改。它是持久的。它不像某些编程语言中只引用内存位置的指针。不过,您可以通过在代码第2节之前和之后运行TEMP1中的select*轻松地测试这一点,您将看到数据是相同的。您可能希望使用order by,以便以相同的顺序返回数据,从而使比较更加容易。否则,数据将或可能以任意顺序返回 将原始SELECT的结果返回到临时表中。临时表与其他任何表一样,尽管表本身是临时的,但其内容具有永久性。这不是一个视图,也不是同义词,或者是一个普通的表表达式,所有这些表达式都会根据它们所包装的表中的内容而改变它们的内容。如果你自己测试它,而不是等待互联网上的人给你一个响应,这不是会简单得多吗?你应该确认一下。@SeanLange我有我自己的答案,从我自己的测试中,结果是正确的永久存储在TEMP1中,但我想与其他专家确认。