声明多个变量以在SAS中的宏中使用?

声明多个变量以在SAS中的宏中使用?,sas,Sas,我在程序中多次重复使用相同的常量变量,所以我想在宏中声明它们,然后为我的函数调用该宏 我有一个这样的例子 %macro vars(); %let trans_1 = ever_30_ct; %let trans_2 = ever_60_ct; %mend vars; %macro run_(); %vars(); proc sql; select &trans_1 from va_purchase_fico_cts; run; %mend

我在程序中多次重复使用相同的常量变量,所以我想在宏中声明它们,然后为我的函数调用该宏

我有一个这样的例子

%macro vars();
    %let trans_1 = ever_30_ct;
    %let trans_2 = ever_60_ct;
%mend vars;

%macro run_();
    %vars();
    proc sql;
    select &trans_1 from va_purchase_fico_cts;
    run;
%mend run_;

%run_();
但是,如果我将run_uu宏更改为此,它将不再工作

%macro run_();
    %vars();
    proc sql;
    select &trans_1 , &trans_2 from va_purchase_fico_cts;
    run;
%mend run_;

它说&trans_2无法解决。有人知道我为什么不能这样做吗?

宏变量范围。这两次都不应该起作用。很可能您在测试中的某个时刻声明了变量trans_1

基本上,宏正在创建本地宏变量,一旦宏完成,这些变量就不再存在。将它们声明为全局宏变量,就可以在宏之外使用它们

%macro vars();
    %global trans_1;
    %global trans_2;
    %let trans_1 = ever_30_ct;
    %let trans_2 = ever_60_ct;
%mend vars;

%global
是最简单的解决方案

因为我同时处理几个项目,所以我尽量避免使用全局变量。我更喜欢为我正在处理的每个项目编写一个入口点宏。然后我从那里调用其他宏。这允许您根据需要在该入口点中声明尽可能多的
%local
变量。当任务完成时,这些变量将消失。比如:

%macro wrap_foo/des='Entry point for task foo';
    %local _trans1 _trans2;
    %foo;
%mend;
如果需要以参数化方式初始化变量,则可以创建使用变量名称的宏。我经常使用它来创建自定义日志消息:

%macro init_constants( varname1, varname2, project )
/des='Parameterized constant initializer.';
    %let &varname1 = &project.1;
    %let &varname2 = &project.2;
%mend;

%macro foo/des='Actual task foo';
    %init_constants( _trans1, _trans2, bar );
    %put &=_trans1 &=_trans2;
%mend;

%wrap_foo;