生成SAS宏代码而不执行它

生成SAS宏代码而不执行它,sas,sas-macro,Sas,Sas Macro,有没有一种方法可以在不执行宏的情况下打印由宏生成的SAS代码 谢谢不,不是一般的。宏是生成SAS代码的程序,所以知道它将生成什么代码的唯一方法是运行它。在一些非常简单的情况下,您可能能够解析宏并确定将生成什么SAS代码,但对于任何更复杂的情况,您必须重新实现一个程序来读取、解析和执行宏,才能使其正常工作。另请参见。有几种方法可以实现您的目标,至少在某些时候是有效的 您可以设置选项obs=0然后运行宏(启用MPRINT)。这将运行宏,但不会处理任何数据行。这将适用于许多宏;但是它会覆盖数据集,所以

有没有一种方法可以在不执行宏的情况下打印由宏生成的SAS代码


谢谢

不,不是一般的。宏是生成SAS代码的程序,所以知道它将生成什么代码的唯一方法是运行它。在一些非常简单的情况下,您可能能够解析宏并确定将生成什么SAS代码,但对于任何更复杂的情况,您必须重新实现一个程序来读取、解析和执行宏,才能使其正常工作。另请参见。

有几种方法可以实现您的目标,至少在某些时候是有效的

您可以设置
选项obs=0
然后运行宏(启用
MPRINT
)。这将运行宏,但不会处理任何数据行。这将适用于许多宏;但是它会覆盖数据集,所以如果你关心它写出来的内容而不是被保存,那就不安全了

%macro do_something;
  data test;
    set sashelp.class;
  run;
%mend do_something;

options mprint;
options obs=0;

%do_something;
工作。注意,测试被覆盖,但未处理任何观察结果

现在,如果您谈论的是存储的编译宏(这似乎是最有用的场景,不是吗?),那么这取决于它是如何存储的。如果它是使用
/source
开关存储的,那么您可以使用
%COPY
将源文件取回

libname sasdir "e:\temp"; 
options mstored sasmstore=sasdir; 

%macro do_something/store source;
  data test;
    set sashelp.class;
  run;
%mend do_something;

%copy do_something/source;

不过,它需要使用
source
标志编译它。如果不是,则源代码在运行代码之前无法恢复。

如果宏主要是data step和proc sql,则另一种方法是使用
运行取消
procsqlnoexec选项,例如:

%macro example(somelogic=1,execute=NO);

  %local cancel noexec;
  %if &execute=NO %then %do;
    %let cancel=cancel;
    %let noexec=noexec;
  %end;

  data some_ds;
    set some_other_ds;
  %if &somelogic %then %do;
    this=that;
  %end;
  run &cancel;

  proc sql &noexec;
  create table maybe as 
    select * from have;

%mend;
这样,代码将被生成/语法检查,但不会执行


当然,这是一种“小心轻放”的方法,因为在宏观环境中仍有许多事情可以更改@Chris Long是正确的-在不执行SAS代码的情况下,没有可靠的方法生成SAS代码(因为生成的实际代码通常取决于早期执行的结果)。

您可以尝试使用PROC STREAM。 让我们定义一个简单的宏

%macro mymacro;
 proc print data=sashelp.class; run;
%mend;
创建一个fileref以包含结果代码

filename mycode temp;
现在,您可以使用
PROC STREAM
将宏调用转换为文本

proc stream outfile=mycode; BEGIN
%mymacro
;;;;

它应该适用于任何不需要根据生成的代码结果做出决策的宏。

您可能不想听的简短回答:使用
%put
statements@user2877959您的建议对小宏有效,但对复杂和长宏无效。谢谢你的建议,你说的是存储编译宏吗?或者,您是否可以访问源文件,但仍希望将其打印出来?还是你自己生成代码?我说的是我写的一个宏,我当然可以访问源代码。我的代码非常简单,我可以通过用宏变量的值替换宏变量来生成SAS代码。但我对一般情况感兴趣,我现在非常确信,这个问题没有普遍的解决办法;如果存在这样的功能,它肯定不会适用于所有宏。正确。只需考虑一个宏可能会做什么——它可能连接到一个实时生产数据库,然后在过去30分钟内接收到的每一个订单生成一些代码,一些额外的代码用于某个值的订单…任何一个通用的宏分析器如何能够预测宏在给定的运行中会处理多少个订单?我认为这个答案在某种程度上误解了我们想要的。是的,您可能必须运行宏,但是运行宏而不运行它生成的SAS代码似乎符合问题的目标。我并不反对在某些情况下目标是不可能的,但问题似乎没有那么复杂;人们可能会对宏代码进行一些静态分析,并确定它是否足够简单,以使其正常工作,我的回答承认了这种可能性。。。然而,一般来说,宏可能会根据它们已经生成的SAS代码的结果采取不同的执行路径,因此我不希望任何人在没有意识到前面无法克服的限制的情况下开始这个项目。