宏中的SAS宏

时间:2018-11-09 18:29:00

标签: sas sas-macro

我有一个问题要问%macro。 我可以在另一个%macro中设置%macro吗?

简短示例-情况的“图片”

%macro Tier_1();

   %do Iter = 1 to &i;

       %macro Tier_2()

       proc sql noprint;
         select
         1*&Iter  into :var
       from work._PRODSAVAIL
       ;quit;

        %put &var;

       %mend;
       %Tier_2();
  %end;

%mend;
%Tier_1();

2 个答案:

答案 0 :(得分:3)

您的问题的答案是“是的,有可能。”但这是可怜的风格。如果仅将%Tier_2的宏定义移到宏Tier_1之外,但将调用保留在其中,则将产生与上面相同的结果。

%macro tier_1();

  ... 

  %Tier_2();
%mend tier_1();

%macro tier_2();
  ...
%mend tier_2;

%tier_1();

如您在上面看到的,您甚至不必以特定的方式对它们进行排序-只要在宏执行之前就对它们进行编译就可以了。

只有在外部宏以某种方式修改了内部宏时,才可以将宏定义放入另一个宏定义中,因此必须重新编译该宏。内部宏每次执行外部宏时。

虽然这是一个理论用例,但我认为这不是您在实践中可能会遇到的用例;还有很多其他方法可以在不实际修改宏代码本身的情况下进行修改,因此,它被认为是较差的编程风格,应避免使用。您正在添加(最少,但有一些)开销,但并没有真正的好处,并使代码难以理解。

答案 1 :(得分:2)

这些定义不是逻辑嵌套的。宏名称只有一个空格。如果您在%submacro%macroA内定义相同的%macroB,则只有一个%submacro,这是最近一次运行的定义。

您可以嵌套宏CALLS(将宏称为宏的一部分),但是嵌套宏定义的源代码不是一个好主意。您可以做到,但这只会使您感到困惑。