【发布时间】:2017-06-13 08:34:18
【问题描述】:
我是使用宏变量的相对新手,似乎已经陷入困境。
我有一个宏,它可以打开一个表并生成一个宏变量 &TBL_DIM。使用 PROC SQL 选择进入。
%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;
%CREATE_DIM_VAR(A, GENDER);
当我执行以下操作时:
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_DIM。
如何将 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;
【问题讨论】:
-
第一个宏创建了 TBL_DIM,所以没有定义 VAR_DIM 也就不足为奇了。假设这只是一个错字,问题可能是由于宏变量的全局与局部范围。尝试添加 '%global tbl_dim;'在两个宏的开头...
-
@ChrisLong 是的,这是一个错字对不起!
-
@ChrisLong 添加 %GLOBAL 似乎可以解决宏变量,但它们显示为空白
-
回复:您的编辑,您有一个本地 SAS 会话和一个远程 SAS 会话,它们是完全独立的 - 在一个中创建的宏变量在另一个中不存在。如果您在本地会话中声明并运行 Execute 宏,则它无权访问远程会话中存在的 TBL_DIM 宏变量。
-
@ChrisLong 尽管 %EXECUTE 宏引用了 &TBL_DIM。在宏内的 rsubmit 会话中?