Tsql 两个不同事务中使用的临时表

Tsql 两个不同事务中使用的临时表,tsql,sql-server-2012,transactions,Tsql,Sql Server 2012,Transactions,我有以下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-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”的对象

第二个事务开始时的检查似乎没有找到与表varieble#t关联的objectId

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


谢谢

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

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

在第一次选择之前,这可能会解决问题…

这是一个编译时问题。您不能在同一批中多次创建同一个命名临时表,无论它们是否位于互斥代码路径中,或者是否存在插入的drop Ok,在本例中,我使用了top 100 select,并且数据数量很少,但是如果删除top 100呢?表变量适用于大量数据?取决于记录的数量,最终取决于列的数量。我使用了一个表变量来处理大约100k条记录,但只有6列左右。不管怎么说,你有没有试着在你的第一个选择前面加上IF…,对不起,我回答了这么长时间。我试着用一滴在前面的第一个选择进入,但它没有工作。我认为@Martin是对的:这是一个编译时问题。