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

Creating and deleting temp tables consecutively in a stored procedure

当我 运行 时这段代码不起作用,我不明白为什么它不应该,错误是 table 已经存在所以它看起来不是更像是一个实际的错误,而是验证过程中的错误,也许我错了。它来自一个过程,所以不能到处使用 go。

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

这些是我的限制条件:

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

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

CREATE PROCEDURE zzzzz_testtodelete
AS
BEGIN
    CREATE TABLE #a(idtmp bit)
    Exec sp_a
        @a = 1
    .....
    DROP TABLE #a

    CREATE TABLE #a(idtmp bit)
    Exec sp_a
        @a = 2
    .....
    DROP TABLE #a
END

这是正常现象还是 sql 的错误?

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

DECLARE @a TABLE (idtmp bit)

这是正常的。这里发生的是编译错误,而不是 运行 时错误。这是因为在解析batch的时候,SQL服务器看到你已经创建了#a,所以重新创建会报错。同样,此错误不是 运行 时错误,而是编译错误。测试:

PRINT 'TESTING'

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

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

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

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

PRINT 'TESTING'

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

GO

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

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


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

此外,根据BOL

If more than one temporary table is created inside a single stored procedure or batch, they must have different names.

解决方法是对 table 使用不同的名称。或者在第一次使用后直接 运行 分类 table。

试试这个方法

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