SQL Server / Oracle:专用临时表

问题描述

正如您所发现的,sql Server和Oracle临时表根本不同。

在Oracle中,全局临时表是永久对象,用于存储特定于临时会话(或特定于事务)的数据。

sql Server中,临时表是存储临时数据的临时对象,其中#temp_tables存储会话本地数据,而## temp_tables存储全局数据。(我从不需要sql Server全局临时表,也不知道它们解决了什么问题。)如果#temp_table是在存储过程中创建的,则在存储过程退出时将被删除。否则,它将在会话关闭时被删除

不,确实没有办法使sql Server模仿Oracle。您可以将普通表与额外的列一起使用,以存储会话ID。但是就减少日志记录而言,您将无法获得临时表的优势。您必须手动删除临时数据。并处理从过早退出的会话中清除的问题。

Oracle和sql Server之间的一个区别是sql Server允许DDL与其他语句包装在事务中。因此,如果需要将临时表用作较大事务的一部分,则该`create table

table_name…语句将不会像create table`Oracle中的语句那样隐式提交当前事务。

解决方法

在Oracle中,您可以使用以下方式创建临时表:

CREATE GLOBAL TEMPORARY TABLE temp_table (
    field1 NUMBER,field2 NUMBER
)
ON COMMIT DELETE ROWS;

…这可能很漂亮,因为这会创建一个所有人都可以看到的表,但是一个INSERT插入表中的数据仅对他或她可见。此外,该数据将在事务或会话结束时自动删除(取决于其声明),从而使其他所有人的临时数据不受损害。

但是,在SQL Server中,可以使用以下方式创建临时表:

CREATE TABLE #temp_table (field1 INT,field2 INT);

…据我所知,它在功能和功能上与Oracle的实现有本质的不同。该临时表仅对您可见,并且在使用后立即被删除(该表)。

SQL Server中是否有能力模仿如上所述的Oracle行为?还是使用临时数据的唯一方法是必须在每次工作迭代中重复创建临时表?