删除并重用存储过程中的临时表

时间:2010-06-05 20:58:20

标签: sql sql-server sql-server-2005 tsql

我需要使用循环多次SELECT INTO临时表但我不能这样做,因为在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

2 个答案:

答案 0 :(得分: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 :(得分: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