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不是一个巨大的约束,这可能是您的选项之一,这里使用nowarn的reset-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代码>所以它在我正在处理的场景中不起作用。