我正在使用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和表才能获取所有状态。因此,我希望外部宏为内部宏设置区域和状态参数。
答案 0 :(得分:1)
您可能要使用%superq()
宏函数来确保宏引用。您可能还想使用%qscan()
而不是%scan()
。
%let RG=%qscan(%superq(SYSPBUFF),&R);
我也不清楚为什么将宏定义推送到远程会话中。可能不需要额外的复杂性。同样,通过rsubmit推送宏定义(尤其是在宏内)可能会导致SAS弄乱代码的解析。如果确实需要在那里定义的宏,请通过自动调用或%include对其进行定义。如果需要,可以使用proc上传来上传文本。