Sri*_*har 637 sql-server sql-server-2005 alter-table temp-tables
我正在使用以下代码检查临时表是否存在,如果存在,则在再次创建之前删除该表.只要我不更改列,它就可以正常工作.如果我稍后添加一列,则会显示错误"无效列".请让我知道我做错了什么.
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
Run Code Online (Sandbox Code Playgroud)
小智 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
Run Code Online (Sandbox Code Playgroud)
小智 79
声明应该是订单
如果没有'GO',整个事物将被视为一个单独的脚本,当select语句查找列时,将无法找到它.
使用"GO",它会将脚本的一部分视为"GO"作为一个批处理,并在"GO"之后进入查询之前执行.
Pரத*_*ீப் 55
相反的dropping,并重新创建临时表,你可以truncate和重用
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
Truncate TABLE #Results
else
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
)
Run Code Online (Sandbox Code Playgroud)
如果您正在使用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,
)
Run Code Online (Sandbox Code Playgroud)
vik*_*kas 51
我认为问题是您需要在两者之间添加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
Run Code Online (Sandbox Code Playgroud)
use*_*628 28
这对我有用: 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;
Run Code Online (Sandbox Code Playgroud)
Iva*_*vak 19
只是我身边的一点评论,因为这OBJECT_ID对我不起作用.它总是会返回
`#tempTable不存在
..尽管确实存在.我发现它存储了不同的名称(后缀为_下划线),如下所示:
#tempTable________
这适合我:
IF EXISTS(SELECT [name] FROM tempdb.sys.tables WHERE [name] like '#tempTable%') BEGIN
DROP TABLE #tempTable;
END;
Run Code Online (Sandbox Code Playgroud)
小智 17
只需一行代码即可完成:
IF OBJECT_ID('tempdb..#tempTableName') IS NOT NULL DROP TABLE #tempTableName;
Run Code Online (Sandbox Code Playgroud)
gbn*_*gbn 10
pmac72正在使用GO将查询分解为批处理并使用ALTER.
您似乎正在运行相同的批处理,但在更改后运行它两次:DROP ... CREATE ... edit ... DROP ... CREATE ..
也许发布您的确切代码,以便我们可以看到发生了什么.
DSR*_*DSR 10
这对我有用,
IF OBJECT_ID('tempdb.dbo.#tempTable') IS NOT NULL
DROP TABLE #tempTable;
Run Code Online (Sandbox Code Playgroud)
这里 tempdb.dbo(dbo 只不过是你的架构) 更重要。
现在,如果您使用的是SQL Server(2016+)的新版本之一,则可以使用以下语法。
DROP TABLE IF EXISTS schema.yourtable(even temporary tables #...)
Run Code Online (Sandbox Code Playgroud)
注意:这也适用于 ## 临时表。
IE
IF OBJECT_ID('tempdb.dbo.##AuditLogTempTable1', 'U') IS NOT NULL
DROP TABLE ##AuditLogTempTable1
Run Code Online (Sandbox Code Playgroud)
注意:这种类型的命令仅适用于 SQL Server 2016 之后的版本。问问自己..我是否还有仍在使用 SQL Server 2012 的客户?
DROP TABLE IF EXISTS ##AuditLogTempTable1
Run Code Online (Sandbox Code Playgroud)
小智 7
我已经创建临时表时通常会遇到此错误; 检查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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1341122 次 |
| 最近记录: |