proc sql outobs=触发SAS警告

proc sql outobs=触发SAS警告,sas,proc-sql,Sas,Proc Sql,我们目前使用的是%runquit宏函数,如下所述()。%runquit宏如下所示。当遇到错误时,它基本上停止运行任何更多的SAS代码,并可用作run和quit语句的替换: %macro runquit; ; run; quit; %if &syserr %then %abort cancel; %mend; 因为在proc sql中使用outobs语句会触发系统错误(即使指定了nowarn选项),这意味着我们在需要使用outobs=选项时无法使用%runquit宏 以下示例将生

我们目前使用的是
%runquit
宏函数,如下所述()。
%runquit
宏如下所示。当遇到错误时,它基本上停止运行任何更多的SAS代码,并可用作
run
quit
语句的替换:

%macro runquit;
  ; run; quit;
  %if &syserr %then %abort cancel;
%mend;
因为在
proc sql
中使用outobs语句会触发系统错误(即使指定了
nowarn
选项),这意味着我们在需要使用
outobs=
选项时无法使用
%runquit

以下示例将生成以下警告消息:

proc sql noprint outobs=3 /*nowarn*/;
  create table tmp as
  select age, count(*) as freq
  from sashelp.class
  group by 1
  order by 2 desc
  ;
%runquit;
警告:由于OUTOBS=3选项,语句提前终止

感谢SAS提供完全不必要的警告。这种行为显然是意料之中的,因为我显式地编写了代码来请求它。当我们在
set
语句中指定
inobs=
outobs=
时,我没有看到警告。为什么proc-sql会得到特殊处理


有没有办法通过
proc sql
中的
outobs=
选项禁用警告问题?或者,是否有其他方法限制proc sql中不会生成错误的输出行?

如果您对执行完整的sql语句没有意见,您可以使用包含
obs
限制的数据步骤视图来解决此问题

proc sql noprint ;
  create table tmp as
  select age, count(*) as freq
  from sashelp.class
  group by 1
  order by 2 desc
  ;
%runquit;

data tmp_fin/view=tmp_fin;
  set tmp(obs=3);
%runquit;

或者将SQL语句设置为视图,并使用数据步骤创建数据集

proc sql noprint ;
  create view tmp_view as
  select age
       , count(*) as freq
  from sashelp.class
  group by 1
  order by 2 desc
  ;
quit;
data tmp;
  set tmp_view(obs=3) ;
run;

考虑到I/O不是一个巨大的约束,这可能是您的选项之一,这里使用nowarnreset-outobs=选项可以实现这一点,但需要付出IOs成本

proc sql;
  create table test as
   select * from sashelp.class;

  reset outobs=10 nowarn;

  create table test1 as 
   select * from sashelp.class;
quit;

您可以根据此处记录的级别向runquit宏添加更多if/then逻辑:。我猜proc sql是不同的,因为inob和outob是非标准sql。大多数SQL风格都使用“limit”语句,这在proc SQL中是不受支持的。@JimL是个不错的主意,但不幸的是,我会让它选择退出的错误非常多。返回的代码是syserr=4,对应于“执行已成功完成,但有警告消息”。这可能是从自动类型转换到未初始化变量的任何东西,也就是说,我首先要抓住的东西。很抱歉我假设您仅在测试时使用outobs选项,而不是在生产中运行时使用。我会仔细考虑一下。在生产环境中使用
OUTOBS
的目的是什么?也许可以通过另一种方式找到解决方案。如果您想避免I/O,也可以使用视图。@Quentin No遗憾的是,它没有。示例:
procsqlnoprint;创建表tmp(obs=1)作为从sashelp.class中选择*;退出实际上这仍然会触发
%abort cancel所以它在我正在处理的场景中不起作用。