有人可以帮助我。 我有下面的代码。它不会产生错误,但同时也达不到我想要的效果。 目的是使用' Select into'为多个列中的每个单元格创建宏变量。我认为问题在于选择'选择进入'也包含宏变量。
%macro ld_macrovar;
proc sql noprint;
select count(portfolio)
into :a
from split_D;
%do i=1 %to &max_comb.; /*already defined elsewhere -actual value=2 */
select _&i.LGD
into :_&i.LGD1 - :_&i.LGD%left(&a)
from split_D;
%end;
quit;
%mend;
%ld_macrovar;
由于
答案 0 :(得分:2)
您的宏变量正被分配到宏的本地范围。因此,如果要在宏外部访问它们,则必须手动将它们分配给全局范围。这可以通过使用%global
statement来实现。或者,您可以执行需要宏内部宏变量的处理。
您可以通过运行%put _ALL_;
or %put _USER_
来检查变量的范围。
%macro ld_macrovar(max_comb);
proc sql noprint;
select count(*) into :rows
from split_D;
quit;
%do i = 1 %to &max_comb.;
%do j = 1 %to &rows.;
%global _&i.LGD&j.;
%end;
%end;
proc sql noprint;
%do i = 1 %to &max_comb.;
select _&i.LGD
into :_&i.LGD1 -
from split_D;
%end;
quit;
%mend;
/* Dummy data */
data split_D;
do i = 1 to 10;
_1LGD = i**2;
_2LGD = exp(i);
output;
end;
run;
%ld_macrovar(2);
/* Print out all the user defined macro variables */
%put _USER_;
您还可以通过在%left
语句中添加trimmed
选项来避免将&a
与into
一起使用(在SAS 9.3及更高版本或{{1在其他版本中)。
提醒:如果您打算使用这些值进行进一步分析,或者有很多行,那么可以更好地实现您想要的效果。宏变量仅存储文本,当存储值时,某些精度可能会丢失。通常,当您需要参数化代码时,最好使用数据集来移动/操作数据和宏变量。