终止整个流程而不是单个程序

Terminate whole process flow instead of single program

如果满足此过程中任何程序中的特定条件,是否有办法停止该过程?

我有一个由 5 个 SAS 程序组成的进程。此过程安排在每天早上 8 点 运行。但是,有时数据库没有刷新,这个过程会发出奇怪的数字。

我需要 "exception control".. 在第二个程序中,我用一些标准检查数据库。如果没有错误,则保留 运行ning 其余代码。否则,发送通知电子邮件并停止 运行 第二个程序和所有 后续 程序。

我尝试 %abort cancel 但它只会终止当前程序。后续程序不受影响。我可以检查每个程序,但这会使代码变得多余...

我也试过 google "terminate SAS process" 但大多数都参考了 abort 没有帮助的陈述...

如果您使用的是企业指南,它是通过逻辑门内置到程序中的。

首先,在判断数据库文件是否为passed/failed("gate program")的程序中,根据该测试为宏变量赋值。大概这个程序只会做你乐意做的事情,即使它失败了。

在流程页面上,右键单击确定数据库文件 passed/failed 和 select 'Condition -> Add' 的程序。

然后添加一个基于宏变量的条件,并使用 'equals' 和您要查找的值(或 'greater than' 或任何有意义的值)。然后select"Then run this task"之后的下一个任务;并将另一个选项放在 Else 运行 此任务之后。

然后,无论哪一个是向前移动的,都应该有指向您想要的其余程序的链接 运行;没有的应该结束这个过程。

SAS 在 KB Sample 39995 中提供了如何执行此操作的示例,包括您可以下载的示例项目。


其次,如果达到错误条件,可以设置OBS=0。这将使 SAS 继续工作,但在大多数情况下它无法做任何事情(因为 OBS=0,那么它只能影响任何数据集的 0 条记录)。我不确定这是否能保证它不会做任何事情,但就我所做的一切而言,这已经足够了。我还使用了 OPTIONS ERRORABEND,如果您使用外部库名称进行所有处理,它就可以正常工作,当 SAS 重新连接时,外部库名称不会自动重新连接。

我的理解是这是一个批处理过程。您没有指定正在 运行 运行进程的操作系统。假设您 运行 在 UNIX/Linux 上使用它(我希望它在 Windows 上是相似的)。让我们假设您的 5 程序进程是 运行 通过以下 shell 脚本: SAS/program1.sas SAS/program2.sas SAS/program3.sas SAS/program4.sas sas /program5.sas

如果您想在 program2.sas 完成并出现错误或警告后停止剩余的进程,您可以将脚本修改为

sas /program1.sas
sas /program2.sas
if [ $? -ne 0 ]
   then
      exit
fi
sas /program3.sas
sas /program4.sas
sas /program5.sas

在此脚本代码中,一个特殊的 shell 脚本变量 $?状态代码从 SAS 的上一个命令传递而来(0 表示成功完成)。如果它不为 0,则整个脚本因退出命令而停止。

有关详细信息和代码示例,请参阅 How to conditionally terminate a SAS batch flow process in UNIX/Linux SAS 博客 post。