SAS CALL SYMPUT在宏内部不工作(以及在此之前)

SAS CALL SYMPUT在宏内部不工作(以及在此之前),sas,sas-macro,Sas,Sas Macro,我需要将数据集中的行数存储在宏变量中。所以我用了这个: %macro get_table_size(inset,macvar); data _null_; set &inset NOBS=size; call symput("&macvar",size); stop; run; %mend; %get_table_size(LOANTAPE.INSTRUMENT_VU21,NUM_REG_INS); %put &NUM_REG_INS; 在我的计算机崩溃之

我需要将数据集中的行数存储在宏变量中。所以我用了这个:

%macro get_table_size(inset,macvar);
 data _null_;
  set &inset NOBS=size;
  call symput("&macvar",size);
 stop;
 run;
%mend;
%get_table_size(LOANTAPE.INSTRUMENT_VU21,NUM_REG_INS);
%put &NUM_REG_INS;
在我的计算机崩溃之前(必须在SAS打开的情况下强制重新启动),这是有效的(我发誓xd)。但是现在,没有创建宏NUM_REG_INS。日志显示:明显的符号参考MACVAR未解析

因此,我将代码作为数据步骤而不是宏进行检查,如下所示:

data _null_;
  set LOANTAPE.INSTRUMENT_VU21 NOBS=size;
  call symput("macvar",size);
 stop;
run;
 %put &macvar
它是有效的。所以问题是在宏中使用此代码时。有人知道这里会发生什么,以及如何解决吗?而且,出于好奇,为什么它以前能工作


谢谢你,真的

可变范围。研究使用
CALL SYMPUTX()
而不是
CALL SYMPUT()
。它以前可能工作过,因为您在测试时全局创建了宏变量,而在本例中,您没有创建宏变量。宏变量不存在于宏外部,除非将其创建为全局宏变量

call symputx("&macvar", size, 'g');

如果要访问宏外部的宏变量,请确保该变量未定义为宏的唯一本地变量。可以使用call symputX的第三个参数强制更新全局宏变量。但是,如果试图调用此宏来更新调用宏的本地宏变量,则可能会遇到问题

只要在宏中添加一行,就可以在宏变量不存在时强制宏变量为全局变量。您还应该使用较新的CALL SYMPUTX()函数,除非您真的希望宏变量值中的前导空格是通过使用较旧的CALL SYMPUT()函数将大小自动转换为字符串而生成的

还要将调用SYMPUTX()移到SET语句之前,这样即使数据集没有观测值,它也会运行

%macro get_table_size(inset,macvar);
%if not %symexist(&macvar) %then %global &macvar;
data _null_;
  call symputx("&macvar",size);
  set &inset NOBS=size;
  stop;
run;
%mend;

天哪,我不知道symputx的用法,我认为使用symput宏变量可以全局存储。非常感谢@Reeza!!