[英]SAS - proc sql for table update in a macro
我有一个代码尝试使用子查询中的宏变量来更新宏块中的表。 我面临的挑战是有时某些宏变量为null,从而使代码失败。 当宏变量产生空值时,如何将其设置为忽略?
%macro update_bucket;
%let macro_fudge = %nrstr(%mend);
proc sql;
%do i=1 %to &rows.;
%do j=1 %to &max_comb.;
%do k=1 %to &max_LGD_comb.;
%do l=1 %to &max_PD_comb.;
%let x = _&&k.LGD&i.;
%let y = _&&l.PD&i.;
%if &x. ^=LTV %then %do;
update sbbook_rb_A as a
set riskbucket = (select risk_bucket from PORTFOLIO_SPLIT_D as b
where a.businessgroup = b.portfolio
and a.product2 = b._&j.subport
and a.&&&x. >= b.min_lgd_driver_%left(&k.) /* at times "a.&&&x." returns a null value */
and a.&&&x. < b.max_lgd_driver_%left(&k.)
and a.&&&y. >= b.min_pd_driver_%left(&l.) /* at times "a.&&&y." returns a null value */
and a.&&&y. < b.max_pd_driver_%left(&l.)
and b.row_num = &i.
)
where riskbucket = '';
%end;
%end;
%end;
%end;
%end;
quit;
%mend;
%update_bucket;
谢谢
在大多数情况下,这种最佳做法是使用参数,而不是全局宏变量。 在这种情况下,您可以为它们提供一个默认值,然后您可以测试该默认值并跳过循环(例如,可以将默认值设置为0)。
%macro mymacro(param1=0, param2=0);
...
%mend mymacro;
无论如何,您都不应该像在该代码中那样依赖全局变量。 宏中使用的任何宏变量都应该是宏的参数,除了非常清楚的全局对象(例如路径)(即使这样,我还是更喜欢将其作为参数)。 您可以将全局值作为参数传递给参数,但应将其明确传递。
测试宏var是否为空的几种方法:
%If &&&x= %then
%If &&&x=%str() %then
%If %length(&&&x)=0 %then
在您的示例中,为防止发生错误,您似乎可以执行以下操作(请不要忘记为%If%Then语句添加尾随的分号):
%If &&&x^=%str() %then and a.&&&x >= b.min_lgd_driver_&k;
还有更多建议:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.