Sas 如果创建的数据集没有行,如何跳过代码
我有一个工作,首先导入一些xlsx文件,然后连接到多个DB表。作业会根据条件选择要输出的行,并创建一个excel文件发送给最终用户 有时,该作业返回零行,这是可以接受的;在这种情况下,我希望创建一个只有变量的空excel文件,但不运行其他代码(检查/清理代码) 如何仅在有结果时才有条件地执行代码 大概是这样的:Sas 如果创建的数据集没有行,如何跳过代码,sas,Sas,我有一个工作,首先导入一些xlsx文件,然后连接到多个DB表。作业会根据条件选择要输出的行,并创建一个excel文件发送给最终用户 有时,该作业返回零行,这是可以接受的;在这种情况下,我希望创建一个只有变量的空excel文件,但不运行其他代码(检查/清理代码) 如何仅在有结果时才有条件地执行代码 大概是这样的: I get 0 rows If Result = 0 then Go to *"here"* Else *"just run the code furth
I get 0 rows
If Result = 0 then Go to *"here"*
Else *"just run the code further"*
你有一些有用的东西可以帮助你 首先,
PROC SQL
设置一个宏变量SQLOBS
,该变量在确定上次运行的SQL查询返回了多少条记录时特别有用
proc sql;
select * from sashelp.class;
quit;
%put I returned &SQLOBS rows;
您可以使用它来驱动进一步的处理,或者使用Tom在注释中指出的%IF
块,或者我将在下面介绍的其他方法
如果您喜欢稍微健壮一点的选项,还可以显式检查数据集中有多少行
proc sql;
select count(*) into :class_count from sashelp.class;
quit;
%put I returned &class_count rows;
对于非常大的数据集,有更快的选项(使用数据集描述符、字典表或其他一些选项),但对于大多数表,这是可以的
不管是哪种方式,我通常会使用一个我打算在生产环境中运行的程序,然后从宏驱动程序的其余部分
%macro whatIWantToDo(params);
...
do stuff
...
%mend whatIWantToDo;
proc sql;
mySqlStuff;
quit;
%if &sqlobs. gt 0 %then %do;
%whatIWantToDo(params);
%end;
%else %do;
%put Nothing to do;
%end;
另一个选项是使用调用执行
;如果您的数据驱动宏参数,这是合适的。callexecute
的最大优点是,只有当您有数据行时,它才会运行——如果您有零行,它就什么都不会做
假设您有一些数据集可以运行代码。您最多可以有十二个,每月一个,但仅在当前日历年有,因此在一月有一个,二月有两个,等等。您可以这样做:
data mydata_jan mydata_feb mydata_mar;
set sashelp.class;
run;
%macro printit(data=);
title "Printing &data.";
proc print data=&data;
run;
title;
%mend printit;
data _null_;
set sashelp.vtable;
where upcase(memname) like 'MYDATA_%' and nobs gt 0;
callstr = cats('%printit(data=',memname,')');
call execute(Callstr);
run;
首先,我创建数据集,使用一个可以通过编程识别的名称。然后,我创建了我想要在每个宏上运行的宏(可以是检查、清理等等)。然后我使用显示创建了哪些表的
sashelp.vtable
,并检查nobs
变量(观察次数)是否大于零。然后我使用callexecute
在该数据集上运行宏 你试过使用宏逻辑吗<代码>%如果…%然后%DO;…%结束代码>?我认为在没有尝试过普通技术的情况下,当它写得很好并且重点突出时,通常可以问一个关于技术的问题——这是一个什么样的问题。(我不确定你是否只是要求澄清,或者建议OP应该做更多的家庭作业或其他什么,但我想澄清我对此的感受。)好的和有趣的问题,而不是我稍后将修正的格式。