放弃后可以重新创建临时表吗?

aar*_*ona 4 sql-server stored-procedures temp-tables

鉴于:

存储过程中的代码:

select bleh
  into #tblTemp
  from FunctionThatReturnsTable('some','params')

-- do some stuff

drop table #tblTemp

-- Error on this command:
-- 'There is already an object named '#tblTemp' in the database.'
select bleh
  into #tblTemp
  from FunctionThatReturnsTable('some','other params')
Run Code Online (Sandbox Code Playgroud)

问题:

我无法重新创建这个临时表.我的工作是使用#tmpTable1,#tmpTable2,#tempTable3等.有没有办法解决这个问题?每次只使用一个临时表会很不错.

如果没有,这是什么原因?

Aar*_*and 11

正如我的评论所反映的,我将建议答案是您为您创建的每个对象使用不同的#temp表名.这有点像对医生说,"当我这样做时会疼." 他可能会做出反应,"停止这样做!"

这是一个问题的原因是SQL Server的解析器尝试一次性解析整个批处理.它可以清楚地看到你试图多次创建相同的#temp表,但是忽略了DROP两者之间的命令(我无法确切地告诉你为什么会这样,因为我无法访问源代码).这与你不能这样做的原因相同:

IF (1=1)
  CREATE TABLE #foo(i INT);
ELSE
  CREATE TABLE #foo(i VARCHAR(32));
Run Code Online (Sandbox Code Playgroud)

解析器看到两个相同的名称,但不能真正遵循IF/ELSE逻辑.

除了避免问题,多个同名的#temp表导致解析器,使用唯一名称的另一个好处是,如果不明确删除它们,它们可以重复使用.这将减轻tempdb在元数据/锁定方面的负担.