SQL Server/Oracle:私有临时表

Ric*_*gan 5 sql oracle sql-server-2008

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

CREATE GLOBAL TEMPORARY TABLE temp_table (
    field1 NUMBER,
    field2 NUMBER
)
ON COMMIT DELETE ROWS;
Run Code Online (Sandbox Code Playgroud)

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

但是,在SQL Server中,您可以使用以下命令创建临时表:

CREATE TABLE #temp_table (field1 INT, field2 INT);
Run Code Online (Sandbox Code Playgroud)

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

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

Sha*_*nce 9

As you have discovered SQL Server & Oracle temporary tables are fundamentally different.

在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 tableOracle中的语句一样隐式提交当前事务.