在SAS数据步骤期间检测缺失值的操作

在SAS数据步骤期间检测缺失值的操作,sas,Sas,是否有方法检测在SAS数据步骤期间对缺失值执行的操作?我看了所有的书,但似乎没有一本能满足我的需要。我认为我无法设置SAS代码检查的严格性,以便注意:生成了缺少的值…消息成为错误(这可能会给&syscc一些值) 示例代码: data _null_; foo=1; bar=2; baz=foo*bar; put foo= bar= baz= "syscc=&syscc syserr=&syserr"; foo=.; bar=2; baz=foo*bar; /*<-- at

是否有方法检测在SAS数据步骤期间对缺失值执行的操作?我看了所有的书,但似乎没有一本能满足我的需要。我认为我无法设置SAS代码检查的严格性,以便
注意:生成了缺少的值…
消息成为错误(这可能会给
&syscc
一些值)

示例代码:

data _null_;
foo=1;
bar=2;
baz=foo*bar;
put foo= bar= baz= "syscc=&syscc syserr=&syserr";
foo=.;
bar=2;
baz=foo*bar;  /*<-- at this point the note about missing values is generated */
/* Here I'd like to be able to do something like; */
/* if [SOME CONDITION] then do;
/*   put "operation on missing values occured!" _ALL_;
/*   [DO SOMETHING];
/* end; */
put foo= bar= baz= "syscc=&syscc syserr=&syserr";
foo=2;
bar=3;
baz=foo*bar;
put foo= bar= baz= "syscc=&syscc syserr=&syserr";
run;
日志输出我希望看到:

FOO=1 BAR=2 BAZ=2 syscc=0 syserr=0
operation on missing values occured! FOO=. BAR=2 BAZ=. _ERROR_=0 _N_=1
FOO=. BAR=2 BAZ=. syscc=0 syserr=0
FOO=2 BAR=3 BAZ=6 syscc=0 syserr=0
NOTE: Missing values were generated as a result of performing an operation on missing values.
      Each place is given by: (Number of times) at (Line):(Column).
      1 at 8:8
NOTE: DATA statement used (Total process time):
我寻找这个(而不仅仅是检查单个变量的值)的原因是,我从一个通过套接字连续收集数据的datastep中得到的关于缺失值的注释很少(从套接字读取的10000行中可能有一行会触发缺失值注释)在datastep中,有几百个数值变量隐藏在宏的三层中,我正试图调试它

[编辑] Jeff和Joe建议的
note2err
dsoption
做了一些事情,但有点太苛刻了。它只是在生成缺少值的消息时立即停止执行,而日志中没有任何其他有用的注释。现在日志是:

FOO=1 BAR=2 BAZ=2 syscc=0 syserr=0
ERROR: Operation performed on missing value at line 8 column 9.
ERROR: Termination due to Missing Value
NOTE: The SAS System stopped processing this step because of errors.
NOTE: DATA statement used (Total process time):

这并没有真正的帮助(尽管如果我不启用它,它会大大增加修复问题的需要)。设置
选项noerrorabend
不会改变此行为。

如果我正确理解您的问题,您可以尝试以下操作:

data _null_;
foo=1;
bar=2;
baz=foo*bar;
put foo= bar= baz= "syscc=&syscc syserr=&syserr";
foo=.;
bar=2;
baz=foo*bar; 
if missing(foo) or missing(bar) then put "operation on missing values occured!" _all_;
else put "operation is Ok!";
put foo= bar= baz= "syscc=&syscc syserr=&syserr";
foo=2;
bar=3;
baz=foo*bar;
put foo= bar= baz= "syscc=&syscc syserr=&syserr";
run;

在我看来,OP希望找到一个解决方案,它不依赖于单独的计算,而是完全基于数据步骤注释/警告的状态。是的,在几层宏中有数百个变量改变值(并循环)。检查每一步都是可能的,但不是很容易的。虽然不是你的完全重复,但得到了一个很好的一般答案,这可能就是你想要的。这不是你问题的确切答案,但你看到了吗?“未记录的NOTE2ERR”选项可能会有所帮助-至少,您会发现它在数据步骤中发生的确切位置(因为它会立即出错)。@Jeff时机不错…@Jeff,这正是我要找的!谢谢这也适用于乔,但我只能在评论中@通知一个人显然。。。
data _null_;
foo=1;
bar=2;
baz=foo*bar;
put foo= bar= baz= "syscc=&syscc syserr=&syserr";
foo=.;
bar=2;
baz=foo*bar; 
if missing(foo) or missing(bar) then put "operation on missing values occured!" _all_;
else put "operation is Ok!";
put foo= bar= baz= "syscc=&syscc syserr=&syserr";
foo=2;
bar=3;
baz=foo*bar;
put foo= bar= baz= "syscc=&syscc syserr=&syserr";
run;