复制mymacro / source到另一个库?

时间:2018-11-28 14:45:01

标签: sas sas-macro

假设我通过以下方式存储了宏:

options mstored sasmstore=FOO;
%macro hello_world() / STORE SOURCE DES='hello world';
  %put hello world;
%mend;

现在我想将此宏从库FOO复制到库BAR,我想要类似的东西(这显然行不通):

%copy hello_world /source LIB = BAR;

这等效于:

options mstored sasmstore=BAR;
%macro hello_world() / STORE SOURCE DES='hello world';
  %put hello world;
%mend;

目标是方便地将宏从开发库复制到生产库。我该怎么办?

2 个答案:

答案 0 :(得分:2)

Proc CATALOG用于将条目从一个成员复制到另一成员

%macro One;
%put ONE;
%mend;

proc catalog catalog=work.sasmacr;
  copy out=work.holdmacr;
  select one / et=macro;
run;

复制条目的另一种方法是使用LIBNAME自动提供的串联功能。

从SAS帮助中

  

示例3:串联SAS目录

     

此示例通过指定   每个文件的物理文件名,并将libref ALLMINE分配给   串联库:

     

libname allmine ('file-1' 'file-2' 'file-3');

     

如果每个库包含一个名为MYCAT的SAS目录,则使用   ALLMINE.MYCAT作为libref.catref提供对目录条目的访问   它们存储在名为MYCAT的所有三个目录中。逻辑上   将名称不同的SAS目录连接起来,请参阅CATNAME   声明。

如果相同名称的目录包含相同的命名条目,则使用最早的库中的条目。

这在单元测试期间确实非常方便,因为在证明更新无损之前不必更改原始文档。您有集成单元测试吗? ;-)

答案 1 :(得分:1)

如果您只想将宏移至生产环境,则PROC CATALOG是正确的处理方法。

*define foo;
libname foo "c:\temp";

*create the stored macro;
options mstored sasmstore=FOO;
%macro hello_world() / STORE SOURCE DES='hello world';
  %put hello world;
%mend;

*define bar;
libname bar "c:\otherdir";

*proc catalog to copy it over;
PROC Catalog catalog = foo.sasmacr;
             copy out=bar.sasmacr;
run;

***reset SAS session before continuing to clear libname foo***;


*now redirect SAS to BAR;
libname bar "c:\otherdir";
options mstored sasmstore=bar;

*and run hello_World- see it works!;
%hello_world;

现在,我可能不会这样做-我将使用git来存储和部署源文件-但是,如果您更喜欢存储的已编译宏,这是最好的方法。