SAS中的全局宏变量的类型

时间:2018-04-02 17:48:57

标签: sas sas-macro

我们可以调用由其创建的GLOBAL MACRO变量  %let, %do, callsymput, sql into子句,

宏参数,

请告诉我。

1 个答案:

答案 0 :(得分:1)

为了便于讨论,最高范围是全球范围

在&符号或superq分辨率时使用的宏变量是当前或最接近的更高范围。如果您需要来自高于默认值的作用域的相同命名宏变量值,则必须从字典表中查询它(SASHELP.VMACRO)

当您计划从宏调用中执行的代码填充全局宏变量时,使用%GLOBAL语句声明宏变量;

使用宏函数%SYSMEXECDEPTH可以知道宏的执行深度。宏系统的“反射”有许多其他宏函数,主要是SAS documentation中的SYS *和SYM *函数。

一个例子。即使在宏执行深度中调用了zoot,zoot宏也会填充全局宏变量age。

options nocenter;

%let MY_MACRO_VAR = global;

%macro foo;
  %local MY_MACRO_VAR;
  %let MY_MACRO_VAR = local_1;

  %put &=MY_MACRO_VAR;

  options nolabel;
  title "&SYSMACRONAME %nrstr(%SYSMEXECDEPTH=)%SYSMEXECDEPTH";
  proc sql;
    select * from dictionary.macros
    where name = 'MY_MACRO_VAR';
  quit;
  options label;

  %bar;
%mend;

%macro bar;
  %local MY_MACRO_VAR;
  %let MY_MACRO_VAR = local_%SYSMEXECDEPTH;

  %put &=MY_MACRO_VAR;

  options nolabel;
  title "&SYSMACRONAME %nrstr(%SYSMEXECDEPTH=)%SYSMEXECDEPTH";
  proc sql;
    select * from dictionary.macros
    where name = 'MY_MACRO_VAR';
  quit;
  options label;

  %put &SYSMACRONAME %nrstr(%SYSMEXECDEPTH=)%SYSMEXECDEPTH;
  %put _user_;  

  %if %SYSMEXECDEPTH=2 %then %bar;

  %zoot
%mend;

%macro zoot;
  %global my_global;
  proc sql noprint;
    select age into :my_global from sashelp.class where name = 'Jane';
  quit;
%mend;

%foo;

%put _user_;

与宏系统的其他交互范围,例如EXECUTE,SYMGET或RESOLVE,可能会变得相当微妙。