全局临时表 - SQL Server与Oracle

时间:2012-01-18 15:35:30

标签: 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;

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

  1. 打开SQL连接(ADO.NET)
  2. 在交易中:
  3. - 将行添加到临时表。
  4. - 在另一张桌子上加入他们,选择结果
  5. - 仅在此会话期间添加的行包含在联接中。另一个线程可能正在同一个临时表上执行。那么本地临时表可能最好在这里吗?
  6. 回滚整个交易。
  7. 根据我在SQL Server中读到的全局临时表,这些表在连接结束后存在,如常规表,以及Oracle中的全局临时表。但是,目前尚不清楚数据的范围。只有创建行的SQL Server会话才能访问它,就像在Oracle中一样吗?使用SQL Server全局临时表的数据的可访问性是什么?你有建议选择实现我的目标吗?

3 个答案:

答案 0 :(得分:4)

默认情况下,SQL Server上的临时表是本地的。会话结束后将删除该表。如果您执行如下脚本:

create table #Foo (
       FooID  int
      ,FooCode1  varchar (20)
)

insert table #Foo (FooID, FooCode1)
values (1001, 'X')

insert table #Foo (FooID, FooCode1)
values (1002, 'Y')

select f.FooID
      ,f.FooCode1
      ,b.BarID
      ,b.BarCode1
  from #foo f
  join bar b
    on bar.FooID = f.FooID -- (or whatever predicate)

查询将仅返回在此会话中加入您在#Foo中插入的内容的行。 #Foo是本地会议;您可以使用自己的#Foo临时表进行多个会话,而无需担心命名空间冲突。会话关闭时,临时表将被丢弃。如果您使用持久数据库连接(例如客户端 - 服务器桌面应用程序),也可以在完成后显式删除#Foo。

答案 1 :(得分:1)

如果在tempdb数据库中手动创建表,则会产生或多或少相同的效果:

USE tempdb;

CREATE TABLE foo...

然后解决它们:

select * from tempdb..foo

会话之间不会删除这些表。您需要手动截断它们,不等于ON COMMIT DELETE ROWS。

答案 2 :(得分:1)

如果在SQL Server中创建全局临时表(## table),它将“生效”并可通过其他会话访问,直到该会话关闭。此外,在原始会话关闭之前,您将无法为同一名称创建相同名称的全局临时表,您将获得该表已存在。为了您的目的,全球临时表不是一个好的解决方案。

本地临时表(#table)会更好,并且可以实现您的目标。

希望这有帮助

相关问题