2012-06-20 67 views
0

以下兩個臨時表,但不同的結構是我的邏輯是應該做的如何使用相同名稱

IF @id = 1 
BEGIN 
    SELECT * INTO #abc from table1 
END 

IF @id = 2 
BEGIN 
    SELECT * INTO #abc frm table2 
END 

然而,當我執行我的發言我得到的錯誤說

已經有一個名爲#abc的對象..

有什麼建議可以解決這個錯誤嗎?

+1

我已經清理了問題,所以只用你的錯誤消息的原因涉及。我相信您的流程的其他部分應該得到一些真正的關注,但您可以分別處理這些問題。 –

+0

謝謝,亞倫! – rock

回答

0

另一種可能的解決方案:

CREATE TABLE #abc (
--put schema here 
) 

IF @id = 1 
BEGIN 
    insert into #abc 
    select * from table1 
END 

IF @id = 2 
BEGIN 
    insert into #abc 
    select * from table2 
END 

select * from #abc 

drop table #abc; 

你總是應該使用的列名,而不是*因爲它在性能方面更好。

而且,select *會查找當前表中的所有列,表格結構中的更改(如添加,刪除或重命名列)會自動修改select *的結果。單獨列出列可讓您更精確地控制結果。

+0

「DROP」沒有幫助。執行和解析產生一個對象已經存在錯誤。 –

+0

@AaronBertrand編輯! –

+0

@aF完全同意你..我故意使用*因爲我有太多的列名隱喻! – rock

3

你不能。解析器不理解您的邏輯IF,並且它將SELECT INTO語句視爲將發生的事情。

你應該做的是:

IF @id = 1 
BEGIN 
SELECT * INTO #abc1 from table1 
END 

IF @id = 2 
BEGIN 
SELECT * INTO #abc2 frm table2 
END 

IF @id = 1 
    SELECT * FROM #abc1; 
ELSE 
    SELECT * FROM #abc2; 

畢竟,你需要知道,在#temp表,以做任何有意義與它不同的欄目,對不對?

(或避免臨時表乾脆。)

+0

這隻能工作,直到選擇INTO#abc1或abc2的東西..正如我在我的問題中提到,我必須把結果(意思#abc1或#abc2)INTO# GrandTotal ..你的邏輯會給我兩個#GrandTotal,這將再次拋出我相同的錯誤 – rock

+0

@ranjith我不明白這個問題。如果#GrandTotal總是SUM(numeric_column),varchar_column'的結果,爲什麼它必須改變?你唯一需要改變的是你是否從#abc1或#abc2中插入總數。如果列是不同的,並且你的查詢必須反映出來,我完全不知道你從命名原來的表得到了什麼。如果你展示你的*整個*腳本,而不僅僅是導致錯誤的部分,你可能會得到更多有用的信息,以便如何以正確的方式做到這一點,而不是你已經決定完成的方式。 –

+0

由於大小限制,我無法在這裏添加整個腳本..是否有任何其他方式..即時通訊對不起,我新到了stackoverflow .. – rock

相關問題