我正在使用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中需要类似的解决方案。我想:
根据我在SQL Server中读到的全局临时表,这些表在连接结束后存在,如常规表,以及Oracle中的全局临时表。但是,目前尚不清楚数据的范围。只有创建行的SQL Server会话才能访问它,就像在Oracle中一样吗?使用SQL Server全局临时表的数据的可访问性是什么?你有建议选择实现我的目标吗?
答案 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)会更好,并且可以实现您的目标。
希望这有帮助