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