这是一种使用SET 语句的NOBS= 选项的简单方法,可确保您的数据集至少有一个观察值。
data want ;
if 0=_nobs then output;
set want nobs=_nobs;
run;
请注意,如果数据集很大并且您不想重新写入数据,那么您可以使用某种方法有条件地生成数据步骤。例如,您可以测试自动宏变量SQLOBS,如果它为 0,则生成数据步骤。在这种情况下,无需测试 nobs,因为您已经这样做了。您也可以使用自动宏变量SYSLAST,而不是对数据集名称进行硬编码。您可以为此使用 CALL EXECUTE,但也可以只使用 IFC() 函数。
%sysfunc(dequote(
%sysfunc(ifc(0=&sqlobs,'data &syslast;output;set &syslast;run;',''))
))
也许最好使用MODIFY 语句并有条件地运行OUTPUT 语句。您可以测试SQLOBS 宏变量。
data &syslast ;
if &sqlobs=0 then output;
modify &syslast ;
stop;
run;
或者您可以使用NOBS= 选项修改语句。
data &syslast ;
if 0=_nobs then output;
modify &syslast nobs=_nobs;
stop;
run;
全SQL解决方案
如果您知道至少一个变量名,那么您可以使用 SQL 插入语句。
insert into &syslast (varname) values (null);
因此,您可以制作一个简单的宏,将数据集名称、观察次数和变量名称作为输入。
%macro ifzeronull(dsn,nobs,avar);
%if &nobs=0 %then %do;
insert into &dsn (&avar) values (null);
%end;
%mend ;
然后您可以留在同一个 PROC SQL 调用中,并有条件地添加观察。
proc sql;
create table want as
select * from sashelp.class
where age=19
;
%ifzeronull(&syslast,&sqlobs,name)
quit;