将多个参数传递给宏

时间:2017-07-05 19:54:37

标签: sql sas

我编写了一个SAS代码,允许我根据公共密钥从另一个数据集(ds2)增加包含信息(var1,var2,var3 ...)的数据集(ds1):

proc sql;
    create table ds1 as
    select a.*, b.var1, b.var2, b.var3, b.var4...
    from ds1 as a left join ds2 as b
    on a.key1 = b.key2;
quit;

我想将此代码转换为宏,因此我可以重用它。如果我只有一个信息变量(var1),那将很容易:

%macro increment(ds1, key1, ds2, key2, varinfo);
    proc sql;
        create table &ds1. as
        select a.*, b.&varinfo.
        from &ds1. as a left join &ds2. as b
        on a.&key1. = b.&key2.;
    quit;
%mend;

但是,我可能想要传递多个信息变量:

%increment(ds1, key1, ds2, key2, var1 var2 var3 var4 var5 var6 var7);

如何重写宏,以便它与#34;参数数组一起使用"?

谢谢!

1 个答案:

答案 0 :(得分:2)

一种选择就是按照你的建议简单地传递它 - 这样可以正常工作。

%macro increment(ds1, key1, ds2, key2, varinfo);
    proc sql;
        create table &ds1. as
        select a.*
            %do i = 1 %to %sysfunc(countw(&varinfo.));
              ,b.%scan(&varinfo.,&i.)
            %end;
        from &ds1. as a left join &ds2. as b
        on a.&key1. = b.&key2.;
    quit;
%mend;

%increment(ds1, key1, ds2, key2, var1 var2 var3 var4 var5 var6 var7);

另一种选择,在实践中不会有任何不同的作用但是对问题的更直接的回答是在宏声明中使用parmbuff选项,这会创建一种虚拟在已知参数之后的任何参数中的宏变量。但是在这种情况下我不建议使用它,因为你可以只使用一个参数。