[英]DROP TABLE IF EXISTS equivalent for TERADATA from SAS
我試圖避免錯誤:
ERROR: Teradata execute: Object 'MY_TABLE' does not exist.
從 SAS 執行 TERADATA SQL 時
這是我使用的原始 SAS 代碼:
proc sql;
connect to TERADATA (user='my_user' password=XXXXXXXXXX MODE=TERADATA TDPID='bdpr');
execute(database MY_DB) by TERADATA;
execute(Drop table MY_TABLE;) by TERADATA;
disconnect from TERADATA;
quit;
根據文檔, .SET ERRORLEVEL 3807 SEVERITY 0
應該可以解決我的問題。
我嘗試在我的DROP TABLE
語句之前插入以下內容:
execute(.SET ERRORLEVEL 3807 SEVERITY 0) by TERADATA;
execute(ECHO '.SET ERRORLEVEL 3807 SEVERITY 0') by TERADATA;
我嘗試將兩者結合起來:
execute(ECHO '.SET ERRORLEVEL 3807 SEVERITY 0'; Drop table MY_TABLE;) TERADATA;
沒有ECHO
的調用有語法錯誤,或者在嘗試ECHO
變體時對錯誤沒有影響。
問題在於 .SET .SET ERRORLEVEL
不是 SQL 語句而是 BTEQ 命令。 根據文檔,應該可以使用ECHO
構造從標准 TERADATA SQL 執行 BTEQ 命令。 但是從 SAS 這似乎不起作用。
我只需要一個解決方案來避免 SAS 錯誤,SAS 端解決方案以及 TERADATA 解決方案對我來說都可以。
如果您將其作為 proc 調用運行,也許這可以幫助您:
replace procedure drop_if_exists( in_object varchar(50))
begin
IF EXISTS(SELECT 1 FROM dbc.tables WHERE tablename = in_object
and databasename='<your database name>') THEN
CALL DBC.SysExecSQL('DROP TABLE ' || in_object);
END IF;
END;
並通過以下方式從 sas 調用它:
execute (call drop_if_exists(MY_TABLE);) by TERADATA;
編輯:SAS調用的過程創建
proc sql;
connect using DBCONN;
execute(
replace procedure drop_if_exists( in_object varchar(50))
begin
IF EXISTS(SELECT 1 FROM dbc.tables WHERE tablename = in_object
and databasename='<my database>') THEN
CALL DBC.SysExecSQL('DROP TABLE ' || in_object);
END IF;
END;
) by DBCONN;
disconnect from DBCONN;
quit;
為什么不詢問 Teradata 該表是否存在,然后讓 SAS 有條件地運行刪除?
%let tablekind=NONE;
select obj into :tablekind trimmed from connection to teradata
(select case when (tablekind in ('T','O')) then 'TABLE'
else 'VIEW' end as obj
from dbc.tablesv
where databasename = 'MY_DB' and tablename= 'MY_TABLE'
and tablekind in ('V','T','O')
)
;
%if &tablekind ne NONE %then %do;
execute(drop &tablekind. MY_DB.MY_TABLE;) by teradata;
%end;
我不知道從 SAS 創建 SP 的語法,但我懷疑您是否有權這樣做。
您可能會要求您的 DBA 安裝以下 SP,它會刪除任何類型的表(包括 Volatile)。
--Drop a table without failing if the table doesn’t exist:
REPLACE PROCEDURE drop_table_if_exists
(
/* database name, uses default database when NULL.
Must be calling user for Volatile Tables
*/
IN db_name VARCHAR(128) CHARACTER SET Unicode,
/* table name */
IN tbl_name VARCHAR(128) CHARACTER SET Unicode,
OUT msg VARCHAR(400) CHARACTER SET Unicode
) SQL SECURITY INVOKER – check the rights of the calling user
BEGIN
DECLARE full_name VARCHAR(361) CHARACTER SET Unicode;
DECLARE sql_stmt VARCHAR(500) CHARACTER SET Unicode;
DECLARE exit HANDLER FOR SqlException
BEGIN
-- catch "table doesn't exist" error
IF SqlCode = 3807 THEN SET msg = full_name || ' doesn''t exist.';
ELSE
-- fail on any other error, e.g. missing access rights or wrong object tye
RESIGNAL;
END IF;
END;
SET full_name = '"' || Coalesce(db_name,DATABASE) || '"."' || Coalesce(tbl_name,'') || '"';
SET sql_stmt = 'DROP TABLE ' || full_name || ';';
EXECUTE IMMEDIATE sql_stmt;
SET msg = full_name || ' dropped.';
END;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.