首页 > 解决方案 > DROP TABLE IF EXISTS 与 SAS 中的 TERADATA 等效

问题描述

我试图避免错误:

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 ERRORLEVEL不是 SQL 语句,而是 BTEQ 命令。根据文档,应该可以使用该ECHO构造从标准 TERADATA SQL 执行 BTEQ 命令。但从 SAS 看来,这似乎不起作用。

我只需要一个解决方案来避免 SAS 错误,SAS 端解决方案和 TERADATA 解决方案都适合我。

标签: sasteradata

解决方案


如果您将其作为 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;

推荐阅读