2013-02-11 47 views
0

我已經解決了這個問題,因爲我忽略了已經是我的代碼的一部分,這種情況是不需要的。具有相同的臨時表名稱和2個不同的IF語句

在SQL Server 2008中,我有兩個IF語句

If value = '' 
begin 
select * into #temptable from table 1 
end 
Else If value <> '' 
begin 
select * into #temptable from table 2 
end 

但是當我嘗試執行它給了我,因爲第二

不是Temptable的:

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

我不我不想使用另一個臨時表名,因爲我不得不更改後面的代碼。有沒有辦法繞過這個?

回答

0

您的SELECT語句正如所寫,正在創建臨時表並將其插入到一個語句中。使用CREATE TABLE語句分別創建臨時表,然後在兩個IF語句中插入INSERT INTO。

+0

有問題的表格每次執行時都會使用不同數量的列動態創建。我如何創建這樣的表格? – JohnZ 2013-02-11 19:39:49

+0

也許更多的上下文會有所幫助 - 你試圖用這張有時看起來像「表1」並且有時看起來像「表2」的表完成什麼? – 2013-02-11 19:44:34

2

我會建議進行一些更改,以便您的代碼更易於維護。您在此處設置的方式存在的一個問題是您使用的語法爲SELECT *。如果您稍後決定對table1或table2的模式進行更改,則可能會產生非顯而易見的後果。在生產代碼中,最好把這些東西拼出來,以便清楚地知道你正在使用哪些列以及在哪裏。

另外,你是否真的使用表1和表2中的所有列後面的代碼?加載更多數據可能會導致性能下降。我會通過使用#temptable的代碼並找出它實際使用的列。然後通過創建臨時表開始:

CREATE TABLE #temptable(col1 int, col2 int, col3 int, col4 int) 

包括所有可以使用的可能列,即使其中一些可能是在某些情況下空。據推測,後面的代碼已經明白這一點。然後,你可以設置你的if語句:

IF value = '' 
BEGIN 
    INSERT INTO #temptable(col1, col2, col3) 
    SELECT x,y,z 
    FROM table1 
END 

ELSE 
    INSERT INTO #temptable(col1, col4) 
    SELECT alpha,beta 
    FROM table2 
END 
0

使用SELECT INTO創建該表上的蒼蠅,你也知道。即使你的查詢只引用了#temptable一次,如果你不止一次運行它(在第一次運行後不刪除表),你會得到相同的錯誤(儘管如果它在存儲過程中,它可能只存在在存儲過程的範圍內)。

但是,你甚至不能編譯這個查詢。例如,對以下查詢使用「分析」命令(Ctrl+F5)即使將相同的表用作源表也會失敗。

select * into #temptable from SourceTable 
select * into #temptable from SourceTable 

如果表1和表2的結構相同,則可以執行以下操作。

select * into #temptable from 
    (select * from Table1 where @value = '' 
    union 
    select * from Table2 where @value <> '') as T 

但是,如果表中具有不同的結構,然後我不知道你可以做些什麼,除了什麼agtD. Lambert建議。

相關問題