SAS宏循环中proc sql select into i=2时宏变量无法解析问题
SAS 宏内PROC SQL生成的宏变量无法解析问题修复
问题原因
cd_2宏变量无法解析,核心是SAS宏变量的作用域规则导致的:
- 未提前声明作用域的宏变量,如果在自定义宏内部通过
PROC SQL SELECT INTO生成,默认会被创建为当前宏的局部宏变量 - 自定义宏执行完毕后,局部宏变量符号表会被直接销毁,全局环境自然无法访问到对应变量
- 代码里
cd_1能正常输出属于SAS符号表查找的边界偶发情况,不是逻辑正确的表现,后续变量都会因为是局部变量被销毁而无法解析。
修复方法
在宏内生成cd_前缀宏变量前,显式用%global声明其为全局宏变量即可,修正后的完整代码如下:
data code; infile datalines delimiter=','; input MUSCLE $ STIMULANTSFL $ ; datalines; baclofen,amphetamine carisoprodol,dexmethylphenidate ; run; * 读取数据集所有变量名; proc sql noprint; select name into : vars1 - :vars2 from dictionary.columns where LIBNAME = 'WORK' and MEMNAME = 'CODE'; quit; %macro getcode; %do i=1 %to 2; * 提前声明要生成的宏变量为全局变量; %global cd_&i.; PROC SQL noprint; select trim(&&vars&i.) into : cd_&i. separated by '|' from code where trim(&&vars&i.) ne ''; quit; %end; %mend; %getcode; %put &cd_1; %put &cd_2;
额外优化点
- 给PROC SQL加
noprint选项,避免在结果窗口输出不必要的查询结果 - 去掉
trim()函数外层多余的括号,简化代码 - 运行后日志会正确输出两个宏变量的值:
baclofen|carisoprodol
amphetamine|dexmethylphenidate
内容的提问来源于stack exchange,提问作者Amy Jiao
相关产品推荐
相关产品推荐

