我正在使用 Oracle 11g 全局临时表,因为我需要一个解决方案,可以将行添加到临时表中以进行联接,并且我只希望添加到临时表中以包含 Oracle 连接/ session 的行。我在 Oracle 中使用全局临时表,因为我希望该表存在于 session 之间,这样就不必在每次创建查询时重新创建它。这效果很好。
我的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)
- 在交易内:
- -将行添加到临时表。
- -将它们连接到另一个表,选择结果
- - 仅在此 session 期间添加的行包含在联接中。另一个线程可能正在同一个临时表上执行。那么本地临时表可能是最好的选择吗?
- 回滚整个事务。
根据我对 SQL Server 中全局临时表的了解,这些表在连接结束后仍然存在,就像常规表和 Oracle 中的全局临时表一样。但目前尚不清楚数据的范围。是否只有创建行的 SQL Server session 才能访问它,就像在 Oracle 中一样? SQL Server 全局临时表数据的可访问性如何?您有实现我的目标的替代方案建议吗?
最佳答案
Oracle 中的临时表是保存 session 本地临时数据的永久对象。 SQL Server 中的临时表是临时对象。
- 在 SQL Server 中,全局临时表保存对所有 session 可见的数据。 “全局临时表在创建后对任何用户和任何连接都是可见的。” 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 ....
来完成(相当于 Oracle 创建表...作为选择...
) 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 版本中有所不同。临时表在从创建它们的存储过程退出时不会被删除,而是在 session 的其余部分继续存在。在以下位置观察到此行为:
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: )
关于sql-server - 全局临时表 - SQL Server 与 Oracle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8912871/