SAS-使用';选择进入';它由其他宏变量组成

SAS-使用';选择进入';它由其他宏变量组成,sas,Sas,谁能帮帮我吗。 我有下面的代码。它不会产生错误,但同时也没有达到我想要的效果。 其目的是使用“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 -

谁能帮帮我吗。 我有下面的代码。它不会产生错误,但同时也没有达到我想要的效果。 其目的是使用“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;

谢谢

您的宏变量被分配到宏的本地范围。因此,如果要在宏之外访问它们,必须手动将它们分配到全局范围。这可以通过使用来实现。或者,您可以执行需要宏内的宏变量的处理

您可以通过运行来检查变量的范围


您还可以通过在语句(在SAS 9.3及更高版本中或在其他版本中,
以“
分隔)中添加第一个
选项,避免将
%left
&a
一起使用



警告:如果您计划使用这些值进行进一步分析,或者有很多行,那么可能会有更好的方法来实现您想要的结果。宏变量仅存储文本,存储值时可能会丢失某些精度。一般来说,最好使用数据集来移动/操作数据和宏变量,以便在需要对代码进行参数化时使用。

应该可以。当您打开
mprint
选项(
options-mprint;
)时,日志中会出现什么内容?
%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_;