全局临时表 - SQL Server与Oracle

Ste*_*bbi 5 sql-server oracle temp-tables

我正在使用Oracle 11g全局临时表,因为我需要一个解决方案,我可以在临时表中添加行以进行连接,并且我只希望包含添加到临时表中的行以连接Oracle Connection/session.我在Oracle中使用全局临时表因为我希望表在会话之间存在,所以每次创建查询时都不必重新创建表.这很好.

我的Oracle表定义如下:

CREATE GLOBAL TEMPORARY TABLE book_id_temp 
( 
   book_id RAW(32)
)ON COMMIT DELETE ROWS;
Run Code Online (Sandbox Code Playgroud)

我在SQL Server 2008-R2方面也有相同的数据库结构,并且在SQL Server中需要类似的解决方案.我想要 :

  1. 打开SQL连接(ADO.NET)
  2. 在交易中:
  3. - 将行添加到临时表.
  4. - 在另一张桌子上加入他们,选择结果
  5. - 仅在此会话期间添加的行包含在连接中.另一个线程可能正在同一个临时表上执行.那么本地临时表可能最好在这里?
  6. 回滚整个事务.

根据我在SQL Server中读到的全局临时表,这些表在连接结束后存在,如常规表,以及Oracle中的全局临时表.但是,目前尚不清楚数据的范围.只有创建行的SQL Server会话才能访问它,就像在Oracle中一样吗?使用SQL Server全局临时表的数据的可访问性是什么?你有建议选择实现我的目标吗?

Sha*_*nce 6

Oracle中的临时表是永久对象,用于保存会话本地的临时数据.SQL Server中的临时表是临时对象.

  1. 在SQL Server中,全局临时表包含对所有会话可见的数据."全局临时表对于任何用户以及创建后的任何连接都是可见的." http://msdn.microsoft.com/en-us/library/ms186986.aspx
  2. 全局临时表仍然是不会无限期持久的临时对象,可能需要在使用前创建.当引用该表的所有用户与SQL Server实例断开连接时,将删除"全局临时表...".http://msdn.microsoft.com/en-us/library/ms186986.aspx

我发现本地临时表或表变量最接近于Oracle的全局临时表,最大的区别是你必须每次都创建它.

通常,在类似你的情况下,步骤3,向临时表添加行,将通过执行select ... into #temp_table_name ....(相当于Oracle create table ... as select ...)来完成http://msdn.microsoft.com/en-us/library/ms188029.aspx

此外,您不能在存储过程中执行以下操作:(伪代码.)

begin proc
   call another proc to create local temp table.
   use temp table
end proc
Run Code Online (Sandbox Code Playgroud)

从创建它们的存储过程返回时,将销毁本地临时表.

更新2014-10-14:本地临时表的行为在SQL Server的Parallel Data Warehousev版本中有所不同.临时表在从创建它们的存储过程退出时不会被删除,而是在会话的其余部分继续存在.观察到此行为:

select @@version
Microsoft SQL Server 2012 - 10.0.5108.1 (X64) Jun 24 2014 20:17:02 Copyright (c) Microsoft Corporation Parallel Data Warehouse (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
Run Code Online (Sandbox Code Playgroud)