sql-server - 全局临时表 - SQL Server 与 Oracle

标签 sql-server oracle temp-tables

我正在使用 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 中使用类似的解决方案。我想要:

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

根据我对 SQL Server 中全局临时表的了解,这些表在连接结束后仍然存在,就像常规表和 Oracle 中的全局临时表一样。但目前尚不清楚数据的范围。是否只有创建行的 SQL Server session 才能访问它,就像在 Oracle 中一样? SQL Server 全局临时表数据的可访问性如何?您有实现我的目标的替代方案建议吗?

最佳答案

Oracle 中的临时表是保存 session 本地临时数据的永久对象。 SQL Server 中的临时表是临时对象。

  1. 在 SQL Server 中,全局临时表保存对所有 session 可见的数据。 “全局临时表在创建后对任何用户和任何连接都是可见的。” 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 创建表...作为选择...) 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/

相关文章:

sql - 请解释一下所附的查询

oracle - 强制 Oracle 删除全局临时表

mysql - 创建一个空的 TEMPORARY 表需要超过 10 秒

sql-server - SQL Server 高可用性本地 - 云

sql-server - SQL Server 将表导出到 .dat 文件

mysql - 将 Liferay 从 Oracle 迁移到 MySQL 时应该考虑什么?

sql - 如何着手优化 Oracle 查询?

tsql - 从 CLR 存储过程访问 TSQL 创建的 #temp 表。是否可以?

sql-server - 从外部系统生成的主键

java - hibernate SQL Server 连接