数据库中已经存在一个名为“#xxxx”的对象。

4

我在单个脚本中多次创建/删除临时表

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

select * into #uDims from table1

.... do something else 

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

select * into #uDims from table2 -- >> I get error here

.... do something else 

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

select * into #uDims from table3  -- >> and here

.... do something else 

我尝试运行这个脚本时,出现了以下错误:

There is already an object named '#uDims' in the database.

在第二个和第三个“select into…”语句中出现了编译时错误。如果我逐个运行脚本的每个部分,一切都会正常工作。

有许多解决此问题的方法,但我想知道为什么SSMS对此感到不满。


1
这是一个存储过程,所以没有GO。 - FLICKER
3
dba.se上的这篇回答正确地解释了这个问题。 - Lamak
3个回答

6

在存储过程内,无法创建相同的临时表。

根据文档(备注部分),

如果在单个存储过程或批处理中创建了多个临时表,则它们必须具有不同的名称。

因此,您必须使用不同的临时表名称,或者在存储过程外部执行此操作并使用GO


虽然这是正确的,但这不是这里所发挥的作用。例如:假设您导入了数据并想将其重命名为临时表,然后检查它是否存在,并最终提供Microsoft非常特殊的智能提示。因此,您可以执行IF OBJECT_ID('tempdb.dbo.imported') IS NOT NULL BEGIN SELECT * INTO ##temptable FROM imported DROP TABLE tempdb.dbo.imported END IF OBJECT_ID('##temptable') IS NULL RAISERROR('errmsg', 20, -1) WITH LOG CREATE TABLE... 在这种情况下,您只创建了一次表,但linter仍然会错误地阻止执行。 - Jessica Pennell

1

Ivan Starostin是正确的。我在我的SQL上测试了这个TSQL,它运行良好。

IF OBJECT_ID('tempdb..#uDims') IS NOT NULL
DROP TABLE #uDims
select top 10 *  into #uDims from tblS
go 
IF OBJECT_ID('tempdb..#uDims') IS NOT NULL
DROP TABLE #uDims
select top 10 * into #uDims from Waters

如果没有使用go语言,我会遇到与你一样的错误(FLICKER)。


3
但是OP说这是在一个存储过程内部,所以他/她不能使用 GO - Lamak
@Flicker,你需要知道为什么出现错误还是如何规避它? - Ivan Starostin
@IvanStarostin 最后一句话是“但我想知道为什么SSMS对此感到不满。” - Lukasz Szozda
如先前提到的,有一些变通方法。我只是想确保这是否是SSMS的问题,或者是否有任何方法可以帮助SSMS不在这方面困扰我,或者有其他建议。 - FLICKER
@IvanStarostin,我不知道没有GO使用DDL有什么问题?我有许多脚本,我创建了临时表或物理表,在一个存储过程中创建它们上的索引/删除它们/更改索引。为什么你要提到DDL必须有GO? - FLICKER
显示剩余4条评论

1

对于一个脚本,就像其他人说的一样,使用GO是解决办法。

然而,如果这实际上是存储过程中的代码,你就有了不同的问题。不喜欢语法的不是SSMS,而是SQL编译器。它看到并卡在那三个INSERT… INTO…语句上,并且不够聪明以意识到你正在删除创建语句之间的表。(即使您取出IF语句,仍然会出现问题。)

解决方法是使用不同的临时表名称。(额外的好处是,由于临时表基于三个不同的表,这将有助于使表结构不同更清晰。)如果您担心内存中存在过多空间,则仍然可以在完成后删除每个临时表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接