【问题标题】:Temp table used in two different transactions两个不同事务中使用的临时表
【发布时间】:2017-02-14 15:28:47
【问题描述】:

我有以下 T-SQL 代码包:

begin tran

  select top 100 *
   into #t 
  from tableA

rollback tran

begin tran

  if OBJECT_ID('tempdb..#t')is not null
    drop table #t

  select top 100 *
   into #t 
  from tableA

rollback tran

当我尝试执行此代码时,我收到以下错误:

数据库中已经有一个名为“#t”的对象。

似乎在第二个事务开始时检查未找到绑定到表变量 #t 的 objectId。

我期待的是#t 将被删除然后重新创建。为什么相同的变量没有被删除,然后我在第二个事务中返回一个错误?

谢谢

【问题讨论】:

  • 这是一个编译时问题。您不能在同一个批次中多次创建同一个命名的临时表,无论它们是在互斥的代码路径中还是存在中间删除dba.stackexchange.com/a/153626/3690

标签: tsql sql-server-2012 transactions


【解决方案1】:

首先,临时表和表变量是有区别的!如果您只处理少量数据,请尝试声明一个表变量并用您的数据填充它。 此外,尝试把

if OBJECT_ID('tempdb..#t')is not null
  drop table #t

在第一个 SELECT INTO 之前 - 这可能会解决问题...

【讨论】:

  • 好的,在这个例子中,我使用了前 100 个选择并且数据数量很少,但是如果我删除 前 100 个呢?表变量适用于大量数据?
  • 取决于记录数,最终取决于列数。我将表变量用于 100k 记录,但只有 6 列或其他内容。无论如何,您是否尝试将 IF...DROP 放在您的第一个 SELECT...INTO 前面?
  • 对不起,我很长时间才回答。我尝试在第一个 SELECT INTO 前面使用 DROP,但它不起作用。我认为@Martin 是对的:这是编译时问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 2015-10-24
  • 1970-01-01
相关资源
最近更新 更多