在 Oracle 中,您可以使用以下命令创建临时表:
CREATE GLOBAL TEMPORARY TABLE temp_table (
field1 NUMBER,
field2 NUMBER
)
ON COMMIT DELETE ROWS;
...这可能非常漂亮,因为这会创建一个对每个人都可见的表,但是插入表中的数据只有他或她可见。此外,该数据会在事务或会话结束时自动删除(取决于其声明),而不会损害其他人的临时数据。
但是,在 SQL Server 中,您可以使用以下命令创建临时表:
CREATE TABLE #temp_table (field1 INT, field2 INT);
...据我了解,它在功能上与 Oracle 的实现有本质上的不同。该临时表仅对您可见,并且在使用后立即删除(该表)。
SQL Server 是否有能力模仿上述 Oracle 行为?或者处理临时数据的唯一方法是必须在每次工作迭代中重复创建临时表?
正如您所发现的,SQL Server 和 Oracle 临时表有根本的不同。
在 Oracle 中,全局临时表是存储临时会话特定(或事务特定)数据的永久对象。
在 SQL Server 中,临时表是存储临时数据的临时对象,#temp_tables 存储会话本地数据,##temp_tables 存储全局数据。 (我从来没有需要过 SQL Server 全局临时表,也不知道它们解决了什么问题。)如果 #temp_table 是在存储过程中创建的,那么当存储过程退出时,它将被删除。否则,当会话关闭时,它将被删除。
不,确实没有办法让 SQL Server 模仿 Oracle。您可以使用带有额外列来存储会话 ID 的普通表。但是您不会获得临时表在减少日志记录方面的优势。您必须手动删除临时数据。并处理清理过早退出的会话。
EDIT:Oracle 和 SQL Server 之间的另一个区别是 SQL Server 允许将 DDL 与其他语句包装在事务中。因此,如果您需要使用临时表作为较大事务的一部分,create table #table_name...
语句不会像 a 那样隐式提交当前事务create table
Oracle 中的语句。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)