我在Enterprise Guide 7.1中开发了一个SAS流程,每天发送电子邮件(如果需要)。
它的工作方式是: [外部程序]生成一个文件,指定需要通过电子邮件发送的人和主题 。 我的sas过程看起来像这样: 1.导入此文件。 2.操纵这个文件。 3.根据被操纵文件的内容生成电子邮件。
问题是,如果在步骤1中导入的原始文件为空,则一切都会崩溃。有没有办法运行导入,检查数据集是否为空,然后是否终止整个sas进程树?
提前感谢您,我一直在搜索,但无济于事。
答案 0 :(得分:0)
最好的方法是将第2步和第3步完全放在宏中,只在第1步数据集不为空时执行它。
step 1 import file in dataset mydata
data _null_;
set mydata nobs=number;
call symput('mydata_count', number);
stop;
run;
%macro m;
%if &mydata_count > 0 %then %do;
step 2 manipulate this file
step 3 generate emails
%end;
%mend;
%m;
作为替代方案,您可以使用语句“Endsas”或“abort”来终止您的工作和会话但是它们可能有不必要的副作用,您可以在使用关键字sas搜索它们时轻松找到这些语句和有关它们的信息。
尽管这两个陈述完成了你原本想要的,但我会推荐我首先发布的逻辑方法,因为你可以更好地控制正在发生的事情,并且在处理语句时可以避免一些不良的副作用< / p>
答案 1 :(得分:0)
IMO更好的方法是开始使用像%runquit;
这样的宏。在这里看到我的答案。 https://stackoverflow.com/a/31390442/214994
基本上,您不是在步骤结束时使用run;
或quit;
,而是使用%runquit;
。如果在该步骤中发生任何错误,则SAS流程的其余部分将被中止。如果批量运行,整个过程都会被终止。如果以交互方式运行,代码执行将停止,但您的交互式会话仍保持打开状态。
编辑:如果文件为空,则假定您收到某种错误消息或警告。