反复创建和删除同名的临时表

时间:2014-12-30 11:59:15

标签: sql sql-server tsql sql-server-2012

我理解调试器正在做什么,但我并不真正同意它,因为以下内容肯定会有效:

IF OBJECT_ID('TEMPDB..#extract') IS NOT NULL DROP TABLE #extract;
CREATE TABLE #extract(
    x                   VARCHAR(100),
    NumX_Rank           NUMERIC(18,2),  
    NumG_Rank           NUMERIC(18,2)
    );

IF OBJECT_ID('TEMPDB..#extract') IS NOT NULL DROP TABLE #extract;
CREATE TABLE #extract(
    x                   VARCHAR(100),
    NumX_Rank           NUMERIC(18,2),  
    NumG_Rank           NUMERIC(18,2)
    );

错误信息如下:

  

Msg 2714,Level 16,State 1,Line 15已经有一个名为的对象   数据库中的'#extract'。

请注意 - 我在整个脚本中声明了我需要的变量,即脚本是存储过程的一部分,变量应该在整个过程中具有范围。

2 个答案:

答案 0 :(得分:1)

使用Go语句,确保当前批量执行的范围

:setvar TotalScope 10
IF OBJECT_ID('tempdb..#extract') IS NOT NULL

 DROP TABLE #extract;
CREATE TABLE #extract(
    x                   VARCHAR(100),
    NumX_Rank           NUMERIC(18,2),  
    NumG_Rank           NUMERIC(18,2)
    );


//what ever Operation what you want to Perform on `#extract`

 GO


// So here `#extract` is not available then You can Create New One Now
select $(TotalScope)


 IF OBJECT_ID('tempdb..#extract') IS NOT NULL

 DROP TABLE #extract;
CREATE TABLE #extract(
    x                   VARCHAR(100),
    NumX_Rank           NUMERIC(18,2),  
    NumG_Rank           NUMERIC(18,2)
    );


   // Again Do what ever Operation what you want to Perform on `#extract`


 GO

  // So here `#extract` is not available then You can Create New One Now

修改

您无法在批量执行之间使用此类型的@TotalScope变量但您需要启用SQL CMD MODE然后您可以使用我更新以上代码

For Reference

注意:如建议您使用alroc而不是创建新表一,如果您截断表格会更好

答案 1 :(得分:1)

在查询结束时不会自动删除临时表,只有在删除当前与DB的连接或使用DROP TABLE显式删除它们时才会删除它们#tablename

已编辑:只要您在循环中运行它,这将作为SP运行,这对我有用,试试这个:

IF OBJECT_ID('TEMPDB..#extract') IS NOT NULL DROP TABLE #extract;

CREATE TABLE #extract(
    x                   VARCHAR(100),
    NumX_Rank           NUMERIC(18,2),  
    NumG_Rank           NUMERIC(18,2)
    );

IF OBJECT_ID('TEMPDB..#extract') IS NOT NULL DROP TABLE #extract;

在它们之间没有'GO',整个事物将被视为一个单独的脚本,所以当CREATE语句尝试创建一个同名的表时,afetr在它之前删除它,它表明它已经存在,因为它是一个单独的脚本,其中同一个表的DROP和CREATE不能齐头并进,因为DROP在执行语句之前没有完全生效,在这种情况下,它是一个大的语句,发生CREATE错误

使用“GO”,它会将脚本的一部分视为“GO”作为一个批处理,并在“GO”之后进入查询之前执行。

所以我再次建议:

IF OBJECT_ID('TEMPDB..#extract') IS NOT NULL DROP TABLE #extract;
CREATE TABLE #extract(
    x                   VARCHAR(100),
    NumX_Rank           NUMERIC(18,2),  
    NumG_Rank           NUMERIC(18,2)
    );
GO
IF OBJECT_ID('TEMPDB..#extract') IS NOT NULL DROP TABLE #extract;
CREATE TABLE #extract(
    x                   VARCHAR(100),
    NumX_Rank           NUMERIC(18,2),  
    NumG_Rank           NUMERIC(18,2)
    );