SAS代码错误地将宏变量的值作为输出中的新列/变量传递

SAS代码错误地将宏变量的值作为输出中的新列/变量传递,sas,sas-macro,Sas,Sas Macro,去了解发生了什么 我在一些宏变量中存储一些日期- data _null_; call symput('month_tag',put(intnx('month',today(),-0),monname3.)); call symput('year',put(intnx('year',today(),0),year.)); run; %put &month_tag &year; 然后我们可以使用这个样本数据集- data sample; input test_a test_b te

去了解发生了什么

我在一些宏变量中存储一些日期-

data _null_;
call symput('month_tag',put(intnx('month',today(),-0),monname3.));
call symput('year',put(intnx('year',today(),0),year.));
run;
%put &month_tag &year;
然后我们可以使用这个样本数据集-

data sample;
input test_a test_b test_c;
cards;
173 181 172
;
run;
该数据集代表了在完成许多总结之后流程中的最后一步。我们希望显示这些带有时间段的摘要。如果我将保存日期的宏变量传递给新创建的
invoice
变量,我们就无法得到想要的结果-

data out;
set sample;
invoice = &month_tag._&year;
run;

如果可以运行此输出,您将看到,出于某种原因,SAS正在创建变量
invoice
,而不是使用宏变量值,而是获取该值并生成另一个变量,该值作为新变量的名称

我和他一起度过了难关-

data out2;
set sample;
invoice = "&month_tag._&year";
run;

我的直觉告诉我,这与我在
invoice
变量中使用/打印
&month\u标签的方式有关。但是如果有人能帮我澄清这一点,我将不胜感激

宏变量的值只是替换引用,SAS然后将结果文本解释为要运行的代码。所以你只是在描述这两种说法之间的区别

invoice = Feb_2018;
invoice = "Feb_2018";

在第一个例子中,右边是一个变量引用。第二个是字符串文字。

&month\u标记。&u&year解析为2018年2月,不带“”,在样本中被视为变量,样本中显然不存在该变量,因此发票会丢失值;对于“”而言,它被视为价值(2018年2月)。解释是有意义的……我的疏忽足够简单。非常感谢。