我正在使用以下代码检查临时表是否存在,如果存在,则在再次创建之前删除该表.只要我不更改列,它就可以正常工作.如果我稍后添加一列,则会显示错误"无效列".请让我知道我做错了什么.
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
小智.. 696
我无法重现错误.
也许我不理解这个问题.
以下在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
@ Conrad.Dean double dot是.dbo的缩写. (77认同)
@deutschZuid更准确地说双点是用户的默认架构,通常是dbo(这不是一个好主意,使dbo成为用户的默认架构,但通常是这样) (31认同)
`'tempdb ..#name'`正是我所需要的.我正在使用''dbo.#name'`,就像一个傻瓜.我得到了`tempdb`部分,但双点有什么用? (28认同)
你的代码与OP有很大的不同,你的"无法重现"的陈述毫无意义.我很高兴你能以不同的方式工作. (8认同)
小智.. 79
声明应该是订单
更改表的声明
走
选择声明.
如果没有'GO',整个事物将被视为一个单独的脚本,当select语句查找列时,将无法找到它.
使用"GO",它会将脚本的一部分视为"GO"作为一个批处理,并在"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
声明应该是订单
更改表的声明
走
选择声明.
如果没有'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 [IF EXISTS] [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, )
我认为问题是您需要在两者之间添加GO语句以将执行分成批处理.作为第二个drop脚本,即IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
没有删除临时表是单个批处理的一部分.你能试试下面的剧本吗?
IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results CREATE TABLE #Results ( Company CHAR(3), StepId TINYINT, FieldId TINYINT, ) GO select company, stepid, fieldid from #Results IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results CREATE TABLE #Results ( Company CHAR(3), StepId TINYINT, FieldId TINYINT, NewColumn NVARCHAR(50) ) GO select company, stepid, fieldid, NewColumn from #Results
这对我有用: social.msdn.microsoft.com/Forums/en/transactsql/thread/02c6da90-954d-487d-a823-e24b891ec1b0?prof=required
if exists ( select * from tempdb.dbo.sysobjects o where o.xtype in ('U') and o.id = object_id(N'tempdb..#tempTable') ) DROP TABLE #tempTable;
只是我身边的一点评论,因为这OBJECT_ID
对我不起作用.它总是会返回
`#tempTable不存在
..尽管确实存在.我发现它存储了不同的名称(后缀为_
下划线),如下所示:
#tempTable________
这适合我:
IF EXISTS(SELECT [name] FROM tempdb.sys.tables WHERE [name] like '#tempTable%') BEGIN DROP TABLE #tempTable; END;
只需一行代码即可完成:
IF OBJECT_ID('tempdb..#tempTableName') IS NOT NULL DROP TABLE #tempTableName;
pmac72正在使用GO将查询分解为批处理并使用ALTER.
您似乎正在运行相同的批处理,但在更改后运行它两次:DROP ... CREATE ... edit ... DROP ... CREATE ..
也许发布您的确切代码,以便我们可以看到发生了什么.
现在,如果您使用的是SQL Server(2016+)的新版本之一,则可以使用以下语法。
DROP TABLE IF EXISTS schema.yourtable(even temporary tables #...)
我已经创建临时表时通常会遇到此错误; 检查SQL语句是否有错误的代码会看到"旧"临时表,并返回后续语句中列数的错误计数,就像从未删除临时表一样.
在创建具有较少列的版本后更改临时表中的列数后,删除表,然后运行查询.
我最近看到DBA做了类似的事情:
begin try drop table #temp end try begin catch print 'table does not exist' end catch create table #temp(a int, b int)