簡體   English   中英

DROP TABLE IF EXISTS 相當於來自 SAS 的 TERADATA

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM