协慌网

登录 贡献 社区

在创建临时表之前,检查是否存在临时表,并删除是否存在

我正在使用以下代码检查临时表是否存在,并在重新创建之前删除该表是否存在。只要我不更改列,它就可以正常工作。如果以后再添加一列,则会显示 “无效列” 错误。请让我知道我在做什么错。

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

该声明应具有顺序

  1. 更改表的语句
  2. 选择语句。

在两者之间没有'GO' 的情况下,整个过程将被视为一个脚本,并且当 select 语句查找该列时,将不会找到它。

使用'GO' 时,它将把直到'GO' 的脚本部分视为一个批处理,并在'GO' 之后进入查询之前执行。

无需dropping并重新创建临时表,您可以truncate并重新使用它

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
    Truncate TABLE #Results
else
    CREATE TABLE #Results
    (
        Company             CHAR(3),
        StepId              TINYINT,
        FieldId             TINYINT,
    )

如果您使用的是Sql Server 2016Azure Sql Database使用以下语法删除临时表并重新创建它。更多信息在这里MSDN

句法

DROP TABLE [如果存在] [database_name。 [schema_name]。 | schema_name。 ] table_name [,... n]

询问:

DROP TABLE IF EXISTS tempdb.dbo.#Results
CREATE TABLE #Results
  (
   Company             CHAR(3),
   StepId              TINYINT,
   FieldId             TINYINT,
  )