Loops 符号参考-DO循环内的扫描功能
我是处理宏变量的相对新手,似乎已经陷入困境 我有一个宏,它打开一个表并生成一个宏变量&TBL_DIM。使用procsqlselectintoLoops 符号参考-DO循环内的扫描功能,loops,macros,sas,Loops,Macros,Sas,我是处理宏变量的相对新手,似乎已经陷入困境 我有一个宏,它打开一个表并生成一个宏变量&TBL_DIM。使用procsqlselectinto %macro CREATE_DIM_VAR(tbl, var); %macro _; %mend _; %syslput tbl = &tbl. / remote=gidwsas; %syslput var = &var. / remote=gidwsas; rsubmit; PROC SQL NOPRINT;
%macro CREATE_DIM_VAR(tbl, var); %macro _; %mend _;
%syslput tbl = &tbl. / remote=gidwsas;
%syslput var = &var. / remote=gidwsas;
rsubmit;
PROC SQL NOPRINT;
*Create SELECT statement for columns we want;
SELECT ALL_DIM INTO: TBL_DIM SEPARATED BY ', '
FROM ALLDIM_LIST
WHERE TBL = "&TBL." AND VAR = "&VAR."
;
QUIT;
endrsubmit;
%mend;
%创建变量(A,性别)
当我执行以下操作时:
rsubmit;
%put &TBL_DIM.;
endrsubmit;
它很好用
但现在,当我尝试在另一个宏中调用它时:
%macro Execute(); %macro _; %mend _;
rsubmit;
%do n = 1 %to 10;
%let THIS_VAR = %scan(&TBL_DIM., &n.));
%put &THIS_VAR.;
%end;
endrsubmit;
%mend;
%执行()
我得到的错误是:
警告:明显符号参考TBL_尺寸未解析
如何将TBL_DIM传递给另一个宏
编辑:
当我修改%Execute()以完全从远程服务器运行时,它可以工作-但我仍然不明白概念上为什么
rsubmit;
%macro Execute(); %macro _; %mend _;
%do n = 1 %to 10;
%let THIS_VAR = %scan(&TBL_DIM., &n.));
%put &THIS_VAR.;
%end;
%mend;
endrsubmit;
rsubmit;
%Execute();
endrsubmit;
我添加我最后的评论作为回答,因为下面的参考给出了OP观察行为的确切原因 计算服务和宏处理之间的交互
在非工作情况下,本地宏处理器正在处理rsubmit/endrsubmit块中的代码,然后再将处理后的块发送到远程服务器。但是,当您在rsubmit/endrsubmit块中声明一个宏时,整个宏将被远程提交和定义。第一个宏创建TBL_DIM,因此没有定义VAR_DIM也就不足为奇了。假设这只是一个输入错误,那么问题可能是由于宏变量的全局范围和局部范围。尝试添加“%global tbl\u dim;”在两个宏的开头…@ChrisLong是的,这是一个输入错误对不起@ChrisLong添加%GLOBAL似乎解决了宏变量问题,但它们显示为空白sre:在您的编辑中,您有一个本地SAS会话和一个远程SAS会话,它们是完全独立的-在一个会话中创建的宏变量在另一个会话中不存在。如果在本地会话中声明并运行Execute宏,则该宏无权访问远程会话中存在的TBL_DIM宏变量。@ChrisLong这与%Execute宏引用&TBL_DIM无关。在宏内部的rsubmit会话中?