Sas 如何屏蔽&x201C;或”;在子宏中,使用SYSPBUFF在宏中传递变量列表

Sas 如何屏蔽&x201C;或”;在子宏中,使用SYSPBUFF在宏中传递变量列表,sas,sas-macro,Sas,Sas Macro,我使用SYSPBUFF将不同数量的参数传递到宏中。具体地说,我正在传递一个状态列表(内部查询)和区域列表(外部查询)。其中一个被使用的州是俄勒冈州,缩写为“或”,这一个州导致了我的错误 我之前问了一个几乎相同的问题,得到的回答解决了这个问题。但是,现在我在另一个宏中添加工作宏,它不再工作了。我在外部宏中遗漏了什么导致内部宏不再工作???我应该澄清一下…它在到达俄勒冈州之前一直有效。因此,宏是功能性的。同样,内部查询可以正常工作并被识别或作为状态值,直到我将其放入外部查询中,然后它停止识别或作为状

我使用SYSPBUFF将不同数量的参数传递到宏中。具体地说,我正在传递一个状态列表(内部查询)和区域列表(外部查询)。其中一个被使用的州是俄勒冈州,缩写为“或”,这一个州导致了我的错误

我之前问了一个几乎相同的问题,得到的回答解决了这个问题。但是,现在我在另一个宏中添加工作宏,它不再工作了。我在外部宏中遗漏了什么导致内部宏不再工作???我应该澄清一下…它在到达俄勒冈州之前一直有效。因此,宏是功能性的。同样,内部查询可以正常工作并被识别或作为状态值,直到我将其放入外部查询中,然后它停止识别或作为状态值

这是我目前的代码:

%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);
状态表位于区域模式中,因此我必须访问多个shema和表才能获得所有状态。因此,我希望外部宏为内部宏设置区域和状态参数。

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


我也不清楚为什么要将宏定义推入远程会话。这种额外的复杂性可能并不需要。此外,通过rsubmit推送宏定义,特别是在宏中,可能会导致SAS打乱代码的解析。如果您确实需要在那里定义宏,请通过autocall或%include进行定义。如果有必要,可以使用proc Upload上传文本。

有时宏引用可能有点棘手。你能说出错误来自哪一行吗?如果没有任何其他信息,我建议尝试以下方法:1。将
%str()
更改为
%bquote()
。2.删除第一个和第二个
%ST=%scan()
语句中的
%str()
并将
%scan()
更改为
%qscan()
。感谢@StuSztukowski为您提供的时间和回复。在此之前,我刚刚找到了解决方案,但考虑到您必须提供的信息有限,直到错误发生的地方,您肯定在正确的轨道上,我相信您的更改会有所帮助!再次感谢!我在另一篇文章中找到了解决方案:它归结为%str和%quote编译时间的差异。在这种情况下,我的内部查询需要在以下行中使用%quote而不是%str:
%do%while(%str(&ST)^=)一旦我做出了改变,它就开始起作用了,我得到了包括可怕的俄勒冈州在内的所有50个州!感谢@Joe对另一篇文章的回答,这篇文章也解决了这个问题!谢谢你,汤姆。你给了我一些思考的东西。我们通常使用远程会话,因为我们处理的数据量太多,使本地机器陷入困境。如果我们利用RSUBMIT,那么我们可以让处理能力发生在一个能力更强的计算环境中,而不会降低本地机器的速度。我过去遇到过一些问题,某些宏在远程环境中的工作方式不一样,但这一个似乎没问题。感谢您的时间和回复。
%let RG=%qscan(%superq(SYSPBUFF),&R);