如何使用在宏

时间:2019-03-27 21:01:05

标签: sas sas-macro

我正在使用SYSPBUFF将各种参数传递给宏。具体来说,我正在遍历状态(内部查询)和区域(外部查询)的列表。使用的状态之一是俄勒冈州,它缩写为“ OR”,并且该状态导致我出错。

我之前曾问过一个几乎相同的问题,并得到了解决该问题的答复。但是,现在我将工作宏添加到另一个宏中,并且它不再起作用。我在外部宏中丢失了什么,导致内部宏不再起作用???我应该澄清一下...它可以工作到俄勒冈州。因此,宏功能正常。再次,内部查询可以正常工作,并将OR识别为状态值,直到将其放入外部查询中为止,然后它停止将OR识别为状态值。

这是我当前的代码:

%macro ALLRG() / parmbuff; 
%let r=1;
%let RG=%scan(&SYSPBUFF,&R);  

%do %while (%str(&RG)^=);

%syslput NUM=&RG;   
%let NUM=&RG;               
%syslput STATES=&&STATESR#   
%let STATES=&&STATESR#      

RSUBMIT;
PROC SQL inobs=1;
connect to oracle
(path=OIGDW ******);
%macro VSNLT() / parmbuff; 
%let i=1;
%let ST=%scan(&SYSPBUFF,&I);  

%do %while (%str(&ST)^=);
CREATE TABLE PHL_&ST._PROV_05_VRSN AS
select TMS_RUN_TIMESTAMP
from connection to oracle
   (SELECT TMS_RUN_TIMESTAMP    
    from r&NUM._own.&ST._PROV_05);

       %let i=%eval(&I+1);  
       %let ST=%scan(&SYSPBUFF,&I);
       %end;
%mend VSNLT;
%VSNLT(&STATES);

 disconnect from oracle;
 QUIT;
 ENDRSUBMIT;

     %let r=%eval(&R+1);  
     %let RG=%scan(&SYSPBUFF,&R);
     %end;
 %mend ALLRG;
 %ALLRG(1,2,3,4,5,6,7,9);

状态表位于区域架构内,因此我必须访问多个shemas和表才能获取所有状态。因此,我希望外部宏为内部宏设置区域和状态参数。

1 个答案:

答案 0 :(得分:1)

您可能要使用%superq()宏函数来确保宏引用。您可能还想使用%qscan()而不是%scan()

%let RG=%qscan(%superq(SYSPBUFF),&R);

我也不清楚为什么将宏定义推送到远程会话中。可能不需要额外的复杂性。同样,通过rsubmit推送宏定义(尤其是在宏内)可能会导致SAS弄乱代码的解析。如果确实需要在那里定义的宏,请通过自动调用或%include对其进行定义。如果需要,可以使用proc上传来上传文本。