2010-06-05 64 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次嘗試創建表,因此它允許創建過程。