2016-03-08 69 views
1

我在一个脚本目前已经在数据库

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 

试图运行脚本的时候,我得到下探/创建临时表中多次评为“#XXXX”对象

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

在第二和第三“选择为...”

这显然是一个编译时错误。如果我按部分运行脚本,那么每件事情都会运行良好。

这个问题有很多解决方法,但我想知道为什么SSMS不满意。

+3

DDL没有GO? –

+1

这是一个存储过程,所以没有GO。 – FLICKER

+3

dba.se中的[这个答案](http://dba.stackexchange.com/a/128866/361)正确解释了这个问题 – Lamak

回答

4

您不能在存储过程中多次创建相同的临时表。

documentation(备注部分),

如果一个存储 过程或批处理中创建一个以上的临时表,它们必须有不同的名称。

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

+0

很高兴知道,我从来没有听说过。谢谢。 – FLICKER

0

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 

没有去,我得到同样的错误,你(抖动)。

+3

,但是op说这是在存储过程中,所以他/她不能使用'GO' – Lamak

+0

就像我刚才提到的那样,它是一个存储过程。从逻辑和技术上讲,我的脚本没有任何问题。这只是SSMS问题。 SSMS试图变得聪明,但这还不够,因为它没有看到我已经在“select into ...”之前丢掉了表格。 – FLICKER

+0

@闪烁,你需要知道你为什么会出错或如何规避它? –

1

对于脚本,正如其他人所说的使用GO是修复。

但是,如果这实际上是存储过程中的代码,则会遇到不同的问题。不是SSMS不喜欢语法,而是SQL编译器。它会在这三条语句中看到和扼杀,并且不够聪明,不会意识到您正在创建语句之间删除表。 (即使你拿出IF声明,你仍然会遇到问题。)

此修复程序使用不同的临时表名称。 (附加福利,因为临时表基于三个不同的表格,这将有助于使表格结构更加清晰。)如果您担心内存空间过剩,您仍然可以放下每个临时表,重新完成它。

相关问题