我正在使用以下代码检查临时表是否存在,并在重新创建之前删除该表是否存在。只要我不更改列,它就可以正常工作。如果以后再添加一列,则会显示 “无效列” 错误。请让我知道我在做什么错。
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
该声明应具有顺序
在两者之间没有'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 2016
或Azure 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,
)