2016-09-29 42 views
3

易失性表很棒,並且與sql server中的臨時表有點相似(我的背景)。有沒有辦法檢查一個易失性表是否已經存在?檢查teradata中是否存在易失性表

DROP TABLE SomeVolatileTable; 
CREATE VOLATILE TABLE SomeVolatileTable AS 
(
    SELECT 
     TOP 10 * 
    FROM SomeSourceTable 
) WITH DATA ON COMMIT PRESERVE ROWS; 

在SQL Server中,你可以檢查一個臨時表存在:當它運行的第一次此代碼將無法正常工作

IF OBJECT_ID('tempdb..#SomeTempTable') IS NOT NULL DROP TABLE #SomeTempTable 

是否類似的東西存在的Teradata?

回答

4

除了HELP VOLATILE TABLE之外,沒有辦法檢查是否存在特定的易失性表格,它返回全部 VT。

但你可能會創建一個存儲過程如下所示:

/* 
    Drop a table ignoring 3807 error (Table doesn't exist) 
*/ 

REPLACE PROCEDURE drop_table_if_exists 
(
    IN db_name VARCHAR(128) CHARACTER SET Unicode, 
    IN tbl_name VARCHAR(128) CHARACTER SET Unicode, 
    OUT msg VARCHAR(400) CHARACTER SET Unicode 
) SQL SECURITY INVOKER 
BEGIN 
    DECLARE full_name VARCHAR(361) CHARACTER SET Unicode; 

    DECLARE sql_stmt VARCHAR(500) CHARACTER SET Unicode; 
    DECLARE exit HANDLER FOR SqlException 
    BEGIN 
     IF SqlCode = 3807 THEN SET msg = full_name || ' doesn''t exist.'; 
     ELSE 
     RESIGNAL; 
     END IF; 
    END; 

    SET full_name = '"' || Coalesce(db_name,DATABASE) || '"."' || tbl_name || '"'; 

    SET sql_stmt = 'DROP TABLE ' || full_name || ';'; 

    EXECUTE IMMEDIATE sql_stmt; 

    SET msg = full_name || ' dropped.'; 
END; 

它只會忽略表不存在錯誤,但仍然無法無效權等

如果你可以用你自己的用戶稱之爲數據庫,它也適用於易失性表格:

CALL drop_table_if_exists(USER,'SomeVolatileTable', msg); 
+0

我沒有權限創建sproc。不管怎麼說,還是要謝謝你。 – cs0815

+1

@csetzkorn:讓您的DBA創建它,這是安全的,因爲它只會刪除提交用戶擁有DROP TABLE權限的表。 – dnoeth

+0

偉大的解決方案,thx!但是在我的機器上,我不得不用'42000'(給定的sqlstate的classvalue + subclassvalue)替換SqlState'T3807'。 – MarkusN

1

而不是在你嘗試創建他們,在你完成他們後,把它們放在腳本中。這將始終有效,可讓您重新運行而不會出現問題,並釋放易失性表使用的後臺空間。

+2

*總是工作*:那麼,在VT掉線之前腳本失效時,您仍然需要處理現有的表。 – dnoeth

+0

好點dnoeth。我通常會嘗試從這一點解決問題,並繼續從失敗的查詢中執行。 –