2014-12-30 35 views
2

我明白調試器做的臨時表,但我真的不同意它,如下面的應該只是工作的肯定:反覆創建和刪除同名

IF OBJECT_ID('TEMPDB..#extract') IS NOT NULL DROP TABLE #extract; 
CREATE TABLE #extract(
    x     VARCHAR(100), 
    NumX_Rank   NUMERIC(18,2), 
    NumG_Rank   NUMERIC(18,2) 
    ); 

IF OBJECT_ID('TEMPDB..#extract') IS NOT NULL DROP TABLE #extract; 
CREATE TABLE #extract(
    x     VARCHAR(100), 
    NumX_Rank   NUMERIC(18,2), 
    NumG_Rank   NUMERIC(18,2) 
    ); 

錯誤信息如下:

消息2714,級別16,狀態1,行15數據庫中已有一個名爲 '#extract'的對象。

請注意 - 我有變量聲明,我需要貫穿整個腳本,即腳本是存儲過程的一部分,變量應該在整個proc中有一個範圍。

+2

如果你要對臨時表相同的結構貫穿始終,爲什麼不'TRUNCATE TABLE'取代'接着'CREATE' DROP'? – alroc

+0

@alroc公平的建議。是否可以不使用「GO」或「TRUNCATE」? – whytheq

+0

這個問題沒有道理。我建議你使用'TRUNCATE',但是你問是否可以在不使用'TRUNCATE'的情況下使用'TRUNCATE'?我說的是:一次**創建表**。如果您需要清空並重新填充它,請使用'TRUNCATE TABLE'而不是'DROP'來重新創建它。 – alroc

回答

1

只使用Go聲明,這保證了當前批次執行範圍

:setvar TotalScope 10 
IF OBJECT_ID('tempdb..#extract') IS NOT NULL 

DROP TABLE #extract; 
CREATE TABLE #extract(
    x     VARCHAR(100), 
    NumX_Rank   NUMERIC(18,2), 
    NumG_Rank   NUMERIC(18,2) 
    ); 


//what ever Operation what you want to Perform on `#extract` 

GO 


// So here `#extract` is not available then You can Create New One Now 
select $(TotalScope) 


IF OBJECT_ID('tempdb..#extract') IS NOT NULL 

DROP TABLE #extract; 
CREATE TABLE #extract(
    x     VARCHAR(100), 
    NumX_Rank   NUMERIC(18,2), 
    NumG_Rank   NUMERIC(18,2) 
    ); 


    // Again Do what ever Operation what you want to Perform on `#extract` 


GO 

    // So here `#extract` is not available then You can Create New One Now 

編輯

您水溼使用這種類型的@TotalScope變量的批次執行產生的,而是需要在SQL CMD MODE然後您可以使用我更新以上代碼

For Reference

注:的建議通過alroc,而不是創建新表之一,如果你截斷表

+0

如果我有變量聲明我想要在整個腳本中作用域,該怎麼辦? – whytheq

+2

這裏有什麼是'GO'的用法。爲什麼問題在不同批次的報表中解決。即使「開始和結束」不需要,只需要「GO」。 –

+0

@NoDisplayName - GO確實擺脫了錯誤信息,所以我認爲你的批評有點苛刻。但我希望在整個過程中都有可用的變量,因此GO會與該要求發生衝突(我的錯誤不包括在OP中) – whytheq

1

臨時表不是在查詢結束時自動下降,只有當對DB當前連接會更好被丟棄或者你明確地DROP TABLE #tablename

EDITED刪除:這將作爲SP只要你在運行它的工作,這個工作對我來說,試試這個:

IF OBJECT_ID('TEMPDB..#extract') IS NOT NULL DROP TABLE #extract; 

CREATE TABLE #extract(
    x     VARCHAR(100), 
    NumX_Rank   NUMERIC(18,2), 
    NumG_Rank   NUMERIC(18,2) 
    ); 

IF OBJECT_ID('TEMPDB..#extract') IS NOT NULL DROP TABLE #extract; 

如果沒有'GO'之間,整個事情將被視爲一個單一的腳本,所以當CREATE語句試圖創建一個同名的表時,先前放棄它,它表明它已經存在,因爲它是同一個表的DROP和CREATE不能同時使用的單個腳本,因爲DROP在語句執行之前不能完全生效,在這種情況下,這是一個大的語句,CREATE錯誤發生了

使用'GO'時,它將把'GO'部分視爲一個批處理,並在'GO'後進入查詢之前執行。

因此,我再次建議這樣的:

IF OBJECT_ID('TEMPDB..#extract') IS NOT NULL DROP TABLE #extract; 
CREATE TABLE #extract(
    x     VARCHAR(100), 
    NumX_Rank   NUMERIC(18,2), 
    NumG_Rank   NUMERIC(18,2) 
    ); 
GO 
IF OBJECT_ID('TEMPDB..#extract') IS NOT NULL DROP TABLE #extract; 
CREATE TABLE #extract(
    x     VARCHAR(100), 
    NumX_Rank   NUMERIC(18,2), 
    NumG_Rank   NUMERIC(18,2) 
    ); 
+0

謝謝 - 我已經添加了一些額外的細節的OP。我有變量,我想要在整個腳本範圍內。 – whytheq

+0

非常歡迎。 – SanyTiger

+0

我做了一個修改,請檢查一下。 – SanyTiger