sas - 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 解决方案都适合我。
解决方案
如果您将其作为 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;
推荐阅读
- apexcharts - 在 ApexCharts 中隐藏 xAxis 类型类别的重叠标签
- docker - 从 Kubernetes 注释/docker 标签/docker 配置中查看原始图像标签
- python - Python 包使用(反向依赖扩展到未安装的)
- sql - SQL Server 2012 未在更新语句中使用专门创建的非聚集索引并导致死锁
- reporting-services - 我们如何在 SSRS 中更改行着色
- php - Wordpress rest_pre_serve_request 产生 PHP 标头警告
- reactjs - reactJS url参数名称在可选时留在url中
- android - build.gradle 文件中的 Groovy MissingPropertyException
- laravel - Laravel - 如何在存储中保存的刀片视频中显示?
- javascript - 在多个 div 之间切换并将文本移动到单个块中