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

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语句错误的代码会看到“旧的”临时表,并在后面的语句中返回错误的列数,就好像临时表从未被删除过一样。

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

其他回答

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

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

这招对我很管用: 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;

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

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

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

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

声明应该是有序的

Alter语句 去 Select语句。

没有'GO'在中间,整个东西将被视为一个单一的脚本,当select语句寻找列时,它将不会被找到。

对于'GO',它将把'GO'之前的脚本部分视为一个单独的批处理,并在'GO'之后进入查询之前执行。