【问题标题】:Pass multiple arguments to macro将多个参数传递给宏
【发布时间】:2017-07-05 19:54:36
【问题描述】:

我编写了一个 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);

如何重写宏以使其与这个“参数数组”一起使用?

谢谢!

【问题讨论】:

  • 尝试 %SUPERQ() 引用字符串并屏蔽逗号。 %superq(var1, var2, var3, var4, var5, var6, var7)
  • @Reeza 在这里只用逗号是不够的(因为他必须在每个逗号后面加上b.),所以不妨给它们留空格。也不知道为什么你在这里建议%superq,因为它们不是变量名——%bquote 不是更合适吗?
  • @Joe,您显然是正确的。我使用的是上一篇文章中的建议。

标签: sql sas


【解决方案1】:

一种选择是按照您的建议简单地传递它 - 这会很好。

%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 选项,它创建了一种虚拟宏变量在已知参数之后的任何参数中。但我不建议在这种情况下使用它,因为您可以只使用单个参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多