当我写:

proc sql;
    select count(*) into :out from sashelp.cars;
quit;

宏变量 out 会变成全局变量还是局部变量?

最佳答案

这取决于。让我们组合一个测试宏,看看会发生什么

%macro test();
proc sql noprint;
select count(*) into :x from sashelp.cars;
quit;
%put IN MACRO: &x;
%mend;

options nosource nonotes;

%symdel x;

%test();

%put Out MACRO: &x;

%let x=2;

%put Out MACRO: &x;

%test();

%put Out MACRO: &x;

创建:
IN MACRO:      428
WARNING: Apparent symbolic reference X not resolved.
Out MACRO: &x
Out MACRO: 2
IN MACRO:      428
Out MACRO:      428

所以一开始,没有X宏变量。 %test() 宏填充了一个局部变量。它在宏之外不可用。

之后,我们设置 %let x=2 使 X 成为一个全局变量。然后我们执行 %test() 宏并看到 X 将其值保留在 %test() 宏之外。

因此,如果它在全局范围内存在,则它会继续存在并被覆盖。如果它在全局范围内不存在,则它继续在全局范围内不存在。

关于sas - 在 PROC SQL 中创建的宏变量是局部还是全局,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33726275/

10-12 19:49