全局宏变量
在宏程序内部, 除了使用 %GLOBAL 语句创建. 在某些情况下, 还可以直接使用 DATA 步中的 CALL SYMPUT 创建.
在一个宏程序中, 在包含 CALL SYMPUT 的 DATA 步程序之前, 如果没有局部宏变量存在(即 SAS 系统还没有为该宏创建 Local Symbol Table), 那么该 CALL SYMPUT 创建的宏变量为全局的宏变量(注:%LET 语句和 INTO 子句无此功能). 即使在 DATA 步之后有了局部的宏变量(有了 Local Symbol Table),CALL SYMPUT 创建的宏变量仍然是全局的
如果该宏程序是带参数的宏程序, 或者在 DATA 步之前使用 %LOCAL 语句 (或者 %LET 语句, 或者 INTO 子句) 创建了局部宏变量, 那么 SAS 系统会为该宏程序创建一个 Local Symbol Table; 所以 CALL SYMPUT 创建的宏变量会存储在 Local Symbol Table 中, 也就是会变成局部宏变量
因此, CALL SYMPUT 创建的宏变量究竟是全局的, 还是局部的, 要看该 DATA 步所在的环境. 如果在该 DATA 步执行时, 无 Local Symbol Table, 那么创建的宏变量就为全局的; 反之, 就是局部的宏变量
特别奇葩的情况
CALL SYMPUT 除以上情况下可创建全局宏变量外, 还有一种比较奇葩的情况. 即使在 DATA 步之前有 Local Symbol Table,CALL SYMPUT 创建的宏变量仍旧是全局的
在 CREATE_GLOBAL 宏程序中的 DATA 步是不完整的, 没有 RUN 语句. 导致在宏运行后, DATA 步并没有执行(因此没有创建宏变量 GL_VAR, 这也是为什么在 CREATE_GLOBAL 宏内部无法输出 GL_VAR 的值).
紧接着, 在后面的 OPEN CODE 中遇到 RUN 语句, 然后才执行该 DATA 步, 实际上该 DATA 步是在 OPEN CODE 的环境中运行的. 因此, 创建的宏变量是全局的宏变量
来源: http://www.bubuko.com/infodetail-3138507.html