我使用 Oracle 11g 全局临时表,因为我需要一个解决方案,可以将行添加到临时表中以进行联接,并且我只希望添加到临时表中以包含 Oracle 连接/会话的行。我在 Oracle 中使用全局临时表,因为我希望该表存在于会话之间,这样就不必在每次创建查询时重新创建它。这效果很好。
我的Oracle表定义如下:
CREATE GLOBAL TEMPORARY TABLE book_id_temp
(
book_id RAW(32)
)ON COMMIT DELETE ROWS;
我在 SQL Server 2008-R2 端也有相同的数据库结构,并且需要在 SQL Server 中类似的解决方案。我想要 :
- 打开 SQL 连接 (ADO.NET)
- 在交易中:
- - 将行添加到临时表。
- -将它们连接到另一个表上,选择结果
- - 仅在此会话期间添加的行包含在联接中。另一个线程可能正在同一个临时表上执行。那么本地临时表可能是最好的选择吗?
- 回滚整个事务。
根据我对 SQL Server 中全局临时表的了解,这些表在连接结束后仍然存在,就像常规表和 Oracle 中的全局临时表一样。但目前尚不清楚数据的范围。是否只有创建行的 SQL Server 会话才能访问它,就像在 Oracle 中一样? SQL Server 全局临时表数据的可访问性如何?您有实现我的目标的替代方案建议吗?
Oracle 中的临时表是保存会话本地临时数据的永久对象。 SQL Server 中的临时表是临时对象。
- 在 SQL Server 中,全局临时表保存对所有会话可见的数据。 “全局临时表在创建后对任何用户和任何连接都是可见的。”http://msdn.microsoft.com/en-us/library/ms186986.aspx
- 全局临时表仍然是临时对象,不会无限期地保留,并且可能需要在使用前创建。 “当引用该表的所有用户与 SQL Server 实例断开连接时,全局临时表...将被删除。”http://msdn.microsoft.com/en-us/library/ms186986.aspx
我发现本地临时表或表变量与Oracle的全局临时表最接近,最大的区别是您每次都必须创建它。
通常,在像您这样的情况下,步骤 3(将行添加到临时表)将通过执行select ... into #temp_table_name ....
(相当于甲骨文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
从创建本地临时表的存储过程返回时,本地临时表将被销毁。
2014年10月14日更新:本地临时表的行为在 SQL Server 的并行数据仓库 v 版本中有所不同。临时表在从创建它们的存储过程退出时不会被删除,而是在会话的其余部分继续存在。在以下位置观察到此行为:
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: )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)