2010-06-05 81 views
4

我需要SELECT循环多次使用临时表,但我不能这样做,因为在SELECT INTO创建的表之后,您无法简单地删除因为你不能删除一个表并在同一批次中再次创建它。删除和重新使用存储过程中的临时表

那么如何删除存储过程中的表并重新创建它? 有没有可能不使用临时表?

这里是我真正使用它应该是一个旋转算法临时表中的一个片段:

WHILE @offset<@NumDays BEGIN 
    SELECT 
    bg.*, j.ID, j.time, j.Status 
    INTO #TEMP1 
    FROM #TEMP2 AS bg 
    left outer join PersonSchedule j on bg.PersonID = j.PersonID and 
    j.TimeSlotDateTime = @StartDate + @offset 

    DROP TABLE #TEMP2; 
    SELECT * INTO #TEMP2 FROM #TEMP1 
    DROP TABLE #TEMP1 

    SET @offset = @offset + 1 
END 
+0

为什么不使用truncate? – 2010-06-05 21:04:12

+0

因为表格结构会随着每次迭代而改变。 – 2010-06-05 21:06:48

+0

希望CTE能够满足您的需求。如果没有,我可以想到涉及以NEWID()命名的动态SQL和全局临时表的相当可怕的方式。 – 2010-06-06 12:05:02

回答

1

在SQL Server 2008中,你被允许在一个循环中删除并重新创建表一个存储过程:

create procedure CreateTablesInALoop 
as 
declare @i int 
set @i = 0 
while @i < 100 
    begin 
    select 1 as id into #t 
    drop table #t 
    set @i = @i + 1 
    print 'Yay' 
    end 
go 
exec CreateTablesInALoop 
go 
+1

谢谢,但我目前正在使用SQL Server 2005 :(。 – Shaegorath 2010-06-06 11:30:03

+0

奇怪的是,它在2005年以及 – Shaegorath 2010-06-06 15:00:54

1

你需要怎么做临时表?

一种选择是使用表变量,而不是临时表。

或者你可以尝试使用Common Table Expressions这样的:

WHILE @offset<@NumDays 
    BEGIN 
     WITH tmp1 AS (SELECT 
     bg.*, j.ID, j.time, j.Status 
     FROM #TEMP2 AS bg 
     left outer join PersonSchedule j on bg.PersonID = j.PersonID and 
     bg.TimeSlotDateTime = j.TimeSlotDateTime and 
     j.TimeSlotDateTime = @StartDate + @offset 
    ) 

SELECT * FROM tmp1 

    SET @offset = @offset + 1 
END 
+0

执行我不得不使用临时表,因为他们可以通过SELECT INTO自动创建正确的模式,因为表没有固定的模式我不能使用表变量(在循环的每次迭代中,新列被添加到临时表) Common Table表达式可能是解决方案,我会尝试它;)。 – Shaegorath 2010-06-06 11:28:20

1

我知道这是一个老帖子,但我想指出的原因,原来海报剧本扔了一个错误,而所提供的示例答案没。

在OP的例子中,虽然他做了一个DROP TABLE,但他也做了2个独立的SELECT命令。虽然建议的解决方案只有一个SELECT INTO(在一个循环中)。 OP的程序在编译时失败。编译器看到两次尝试创建相同的表,而在建议的解决方案中,编译器只看到1次尝试创建表,因此它允许创建过程。