在存储过程中连续创建和删除临时表

时间:2015-08-20 08:08:36

标签: sql sql-server transactions temp-tables

这段代码在我运行时并不起作用,而且我不明白为什么它不应该,错误是表格已经存在所以它看起来并不像一个实际的错误,但验证过程中的错误,也许我错了。它来自一个程序,所以无处可去使用go。

在我的第一个问题中,我严重过度简化了我的问题

这些是我的约束:

我使用临时表来在程序之间进行通信,在这种情况下,我需要使用相同的程序两次,但使用不同的参数,所以我需要表格#34;#a"被告知两次。因为工作方式是在执行过程之前创建临时表,并且在该形式中,过程将知道是否需要执行select或通知表。如果它通知表,它也负责创建列(这样做是为了避免程序之间的依赖关系)。所以我不能重复使用同一个表,因为列已经创建了。

我找到的解决方案是创建另一个存储过程,它将完成第二部分的工作,我本可以更改过程sp_a但我不能实际控制它。

SQL > SELECT name FROM V$DATAFILE;
SQL > SELECT * FROM V$LOGFILE;

这是正常的还是来自sql的错误?

3 个答案:

答案 0 :(得分:2)

这很正常。这里发生的是编译错误,而不是运行时错误。这是因为在解析批处理时,SQL Server发现您已经创建了#a,因此再次创建它将产生错误。同样,此错误不是运行时错误,而是编译错误。测试:

PRINT 'TESTING'

CREATE TABLE #a(idtmp bit)
DROP TABLE #a

CREATE TABLE #a(idtmp bit)
DROP TABLE #a

请注意,由于编译错误,甚至没有执行批处理,因此不打印TESTING

GO和第二DROP之间放置一个CREATE将解决问题:

PRINT 'TESTING'

CREATE TABLE #a(idtmp bit)
DROP TABLE #a

GO

CREATE TABLE #a(idtmp bit)
DROP TABLE #a

这是因为您现在有两个单独的批次。 SQL Server按批处理解析和验证sql查询。

只有在OP编辑之后,他/她才声明这是在存储过程中使用的。在那种情况下,没有真正的解决方案。不过,这是一个编译错误。代码未执行。

此外,根据BOL

  

如果在单个存储中创建了多个临时表   程序或批次,它们必须有不同的名称。

解决方法是为表使用不同的名称。或者只是在第一次使用后截断表格。

答案 1 :(得分:0)

临时表在存储过程中效率较低,尝试使用表类型,您不需要删除它们。

DECLARE @a TABLE (idtmp bit)

答案 2 :(得分:0)

试试这种方式

IF Object_id('tempdb..#temp') is not null                
    Drop table #temp  
create table #temp (table columns as desired)