繁体   English   中英

SAS-在宏中更新表的proc sql

[英]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;

还有更多建议:

  • 如果紧随其后的是空格或分号,则不需要在宏变量后加上尾随时间。
  • 不需要在宏var计数器周围使用%left()宏函数...它们的创建没有前导或尾随空格。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM