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

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

当前回答

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

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

其他回答

我无法重现这个错误。

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

下面的工作为我在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

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

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

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

我最近看到一个DBA做了类似的事情:

begin try
    drop table #temp
end try

begin catch 
    print 'table does not exist'
end catch 

create table #temp(a int, b int)

只是我的一点评论,因为OBJECT_ID不适合我。它总是返回那个

' #tempTable不存在

..即使它确实存在。我刚刚发现它存储了不同的名称(由_下划线结尾),就像这样:

# tempTable________

这对我来说很管用:

IF EXISTS(SELECT [name] FROM tempdb.sys.tables WHERE [name] like '#tempTable%') BEGIN
   DROP TABLE #tempTable;
END;

这招对我很管用: social.msdn.microsoft.com/forums/en/transactsql/thread/02c6da90 - 954 d - 487 d - a823 e24b891ec1b0 ? =教授

if exists (
    select  * from tempdb.dbo.sysobjects o
    where o.xtype in ('U') 

   and o.id = object_id(N'tempdb..#tempTable')
)
DROP TABLE #tempTable;