我使用下面的代码来检查临时表是否存在,如果它存在,则在重新创建之前删除表。只要我不改变列,它就可以工作。如果我稍后添加一个列,它会给出一个错误,说“无效列”。请让我知道我做错了什么。

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
    DROP TABLE #Results

CREATE TABLE #Results
(
    Company                CHAR(3),
    StepId                TINYINT,
    FieldId                TINYINT,
)

select company, stepid, fieldid from #Results

--Works fine to this point

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
    DROP TABLE #Results

CREATE TABLE #Results
(
    Company                CHAR(3),
    StepId                TINYINT,
    FieldId                TINYINT,
    NewColumn            NVARCHAR(50)
)

select company, stepid, fieldid, NewColumn from #Results

--Does not work

当前回答

注意:这也适用于## temp表。

i.e.

IF OBJECT_ID('tempdb.dbo.##AuditLogTempTable1', 'U') IS NOT NULL
DROP TABLE ##AuditLogTempTable1

注意:这种类型的命令只适用于SQL Server 2016之后。 问问你自己…我的客户还在使用SQL Server 2012吗?

DROP TABLE IF EXISTS ##AuditLogTempTable1

其他回答

pmac72使用GO将查询分解成批,并使用ALTER。

你似乎在运行同一个批处理,但在更改后运行了两次:DROP…创建…编辑……滴……创建. .

也许可以发布你的确切代码,这样我们就可以看到发生了什么。

这对我很有效,

IF OBJECT_ID('tempdb.dbo.#tempTable') IS NOT NULL 
DROP TABLE #tempTable; 

这下边。Dbo (Dbo只是您的模式)变得更加重要。

当我已经创建了临时表时,我通常会碰到这个错误;检查SQL语句错误的代码会看到“旧的”临时表,并在后面的语句中返回错误的列数,就好像临时表从未被删除过一样。

在创建了列更少的版本后,更改临时表中的列数后,删除表,然后运行查询。

更改临时表中的列时,必须删除该表,然后才能再次运行查询。(是的,这很烦人。这正是你必须做的。)

我一直认为这是因为“无效列”检查是在查询运行之前由解析器完成的,因此它是基于删除表之前的列.....PNBS也是这么说的。

现在,如果您正在使用SQL Server(2016+)的新版本之一,则可以使用下面的语法。

DROP TABLE IF EXISTS schema.yourtable(even temporary tables #...)