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

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

当前回答

我无法重现这个错误。

也许我没有理解这个问题。

下面的工作为我在SQL Server 2005,与额外的“foo”列出现在第二个选择结果:

IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
GO
CREATE TABLE #Results ( Company CHAR(3), StepId TINYINT, FieldId TINYINT )
GO
select company, stepid, fieldid from #Results
GO
ALTER TABLE #Results ADD foo VARCHAR(50) NULL
GO
select company, stepid, fieldid, foo from #Results
GO
IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
GO

其他回答

我无法重现这个错误。

也许我没有理解这个问题。

下面的工作为我在SQL Server 2005,与额外的“foo”列出现在第二个选择结果:

IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
GO
CREATE TABLE #Results ( Company CHAR(3), StepId TINYINT, FieldId TINYINT )
GO
select company, stepid, fieldid from #Results
GO
ALTER TABLE #Results ADD foo VARCHAR(50) NULL
GO
select company, stepid, fieldid, foo from #Results
GO
IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
GO

注意:这也适用于## 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

这可以用一行代码来完成:

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

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

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

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

是的,“无效列”这个错误从行“select company, stepid, fieldid, NewColumn from #Results”引发。

运行t-sql有两个阶段,

首先,解析,在这个阶段,SQL server检查你提交的SQL字符串的正确性,包括表的列,并优化你的查询,以最快的速度检索。

第二,运行,检索数据。

如果表#Results存在,解析过程将检查你指定的列是否有效,否则(表不存在)解析将通过传递你指定的检查列。