SAS Data Step if语句不起作用

时间:2016-05-05 21:20:45

标签: sas

使用以下代码,电子邮件始终会被发送。 1显然不等于0,但它仍然运行。我试过删除do部分,但仍然遇到同样的问题。

data _null_;
set TestTable;
if 1 = 0 then do;
    file sendit email
    to=("email@gmail.com")
    subject="Some Subject Line";
end;    
run;

2 个答案:

答案 0 :(得分:7)

虽然file语句被认为是可执行语句(因此不应在伪if语句后面执行),但这并非完全正确。 SAS在编译期间看到file语句,并且知道它需要创建要写入的文件 - 因此,它有点编译时间。这就是这里发生的事情 - 由于编译器的活动,SAS创建了文件(在本例中是电子邮件),然后实际上并没有用任何东西填充它,但在一天结束时仍然有一封电子邮件。

任何其他文件都会发生同样的事情 - 就像这样:

data _null_;
  set sashelp.class;
  if 0 then do;
      file "c:\temp\test_non_zero.txt";
      put name $;
  end;
run;

该代码创建一个空白文件。

如果您需要有条件地发送电子邮件,我建议您在宏中包装电子邮件代码,然后使用数据集中的call execute或类似内容调用该宏。像这样:

%macro write_email(parameters);
data _null_;
  file sendit email
  to=("email@gmail.com")
  subject="Some Subject Line";
run;
%mend write_email;

data _null_;
  set TestTable;
  if 0 then do;
     call execute('%write_email(parameters)');
  end;
run;

答案 1 :(得分:1)

使用电子邮件指令中止邮件。 http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a002058232.htm

data _null_;
  file sendit email to=("email@gmail.com") subject="Some Subject Line";
  if nobs=0 then put '!EM_ABORT!';
  set TestTable nobs=nobs;
  ....
run;