SQL:如果基数 table 发生变化,稍后调用时 temp table return 会产生不同的结果吗?

SQL: Does a temp table return different results when called later if the base table changes?

假设我有以下内容:

--Section 1
SELECT * INTO #TEMP1 FROM TABLEA

--Section 2
/*more code here*/

--Section 3
SELECT * FROM #TEMP1

在第 2 节的处理过程中,TABLEA 发生了显着变化。在第 3 节,我的临时 table return 是原始 SELECT INTO 的结果还是 return 当前 table 的结果?

临时 table 没有 link 或 "knowledge" 它是如何填充的。事实上,SELECT ... INTO 只是 一种 填充临时 table 的方法。它可以由多个不同的语句填充,有一些数据 UPDATEd 或 DELETEd 等

它不关心数据来自哪里,它只存储您插入其中的行。在大多数方面,它就像任何其他 table.


如果您想要 "stores" 一个查询而不是一组结果(也就是说,如果您希望它始终反映当前状态),您可以通过定义游标来获得类似的东西(设置适当的选项使其成为动态游标)。

但几乎总是,游标是对 任何 问题的错误答案,并且不能像临时 [=29] 一样在以后的查询中直接使用=]是。

没有。 table 是它创建时的快照——除非您使用 DML 显式更改了内容("data modification language",例如 insertdeleteupdate, truncate).

如果你想要一些随基础变化的东西 table,那么使用视图:

create v_tableA as
    select a.* 
    from TABLEA a;

这将在调用时重新计算,因此它 "changes" 以 table(s) 为基数。

正如@TaPaKaHUA 所说,#TEMP1 中的数据不会改变。它是持久的。它不像某些编程语言中的 pointer 那样只引用内存位置。不过,您可以通过 运行 select * from #TEMP1 在代码的第 2 部分之前和之后轻松地进行测试,您会发现数据是相同的。不过,您需要使用 order by,这样数据会以相同的顺序返回,从而使比较更加容易。否则,数据将或可能以任意顺序返回。 More on that in this blog post if you are interested.