我的编程经验非常有限,如果可能的话,需要一个相当基本的答案。 我的第一个表有呼叫详细信息,第二个表有呼叫ID匹配的地址 我的问题是第一个表返回零结果(这将经常发生)第二个表错误,因为第一个表中没有数据。 所以我想在第一个表执行后如果没有结果然后停止/退出,如果有结果然后继续。我已经看了这个,但我找到的所有解决方案都是技术性的,我不会放弃了解我为此无法实现的所有建议。所以我已经说过,我真的需要一个非常简单易懂的解释 具有非常基本的编程知识或建议的人,可以采取哪些措施来解决这个问题。谢谢
答案 0 :(得分:0)
我遇到了同样的问题并用一个简单的宏修复了这个问题:
%macro check_data(table=);
data _null_;
call symput('varnobs',n_obs);
stop;
set &table nobs=n_obs;
run;
%if &varnobs = 0 %then %do;
ENDSAS;
%end;
%mend check_data;
%check_data("table1");
简短的解释,你给宏的表名,它计算obervations并将它们写入macrovariable varnobs。使用停止是因为在执行set语句之前计算nobs,所以我在它之前停止datastep。根据varnobs中的数字,您可以按照您的意愿行事,例如使用abort或endsas关闭进程,执行特定代码等...
我必须承认,使用ENDSAS是可讨论的命令,因为它会关闭所有内容,更好的解决方案是使用逻辑方法,例如
%if &varnobs ne 0 %then %do;
data table2;
*do your second dataset operation inside the macro only when varnobs is not 0...;
run;
%end;
或将您的整个代码放入宏...
我希望这段代码对您来说已经足够基础了,目前我无法在不使用宏变量的情况下考虑解决方案......
答案 1 :(得分:0)
谢谢kl78
我已经复制了您提供的代码,现在我收到错误说"更多的位置参数找到了定义的"
我的代码如下
%macro check_data(table = qldreps);
数据 null ;
call symput('varnobs',n_obs);
stop;
set &table nobs=n_obs;
运行;
%if& varnobs = 0%然后%do;
ENDSAS;
%端;
%mend check_data;
proc sql;
将表qldreps创建为
选择c.incident_num,
c.incident_type
来自cad.incindet的作为c
其中c.incident_type = 601;
退出;
%check_data(" qldreps&#34);
proc sql;
将表格详细信息创建为
选择b.details
来自qldreps作为,
cad.incident_detail as b
其中a.incident_number = b.incident_number;
退出;
我没有得到什么?谢谢