Sas 如果创建的数据集没有行,如何跳过代码

Sas 如果创建的数据集没有行,如何跳过代码,sas,Sas,我有一个工作,首先导入一些xlsx文件,然后连接到多个DB表。作业会根据条件选择要输出的行,并创建一个excel文件发送给最终用户 有时,该作业返回零行,这是可以接受的;在这种情况下,我希望创建一个只有变量的空excel文件,但不运行其他代码(检查/清理代码) 如何仅在有结果时才有条件地执行代码 大概是这样的: I get 0 rows If Result = 0 then Go to *"here"* Else *"just run the code furth

我有一个工作,首先导入一些xlsx文件,然后连接到多个DB表。作业会根据条件选择要输出的行,并创建一个excel文件发送给最终用户

有时,该作业返回零行,这是可以接受的;在这种情况下,我希望创建一个只有变量的空excel文件,但不运行其他代码(检查/清理代码)

如何仅在有结果时才有条件地执行代码

大概是这样的:

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应该做更多的家庭作业或其他什么,但我想澄清我对此的感受。)好的和有趣的问题,而不是我稍后将修正的格式。